2012-11-16 7 views
11

Sto semplicemente cercando di ottenere un elenco di nomi di file con un percorso con caratteri jolly.Perl: strano comportamento di glob con file superiori a 2 GB

my $path = "/foo/bar/*/*.txt"; 
my @file_list = glob($path); 
foreach $current_file (@file_list) { 
    print "\n- $current_file"; 
} 

Principalmente questo funziona perfettamente, ma se c'è un file superiore a 2 GB, da qualche parte in una delle/foo/bar/* sottotracciati, il glob restituisce un array vuoto senza alcun errore o avviso.

Se rimuovo il file o aggiungere una sequenza di caratteri/staffa in questo modo:

my $path = "/foo/bar/*[0-9]/*.txt"; 

o

my $path = "/foo/bar/*1/*.txt"; 

poi il glob funziona di nuovo.

UPDATE:

Ecco un esempio (per una questione di politica aziendale ho dovuto mascherare il percorso):

[root]/foo/bar # ls -lrt 
drwxr-xr-x 2 root  system   256 Oct 11 2006 lost+found 
drwxr-xr-x 2 root  system   256 Dec 27 2007 abc*** 
drwxr-xr-x 2 root  system   256 Nov 12 15:32 cde*** 
-rw-r--r-- 1 root  system 2734193149 Nov 15 05:07 archive1.tar.gz 
-rw-r--r-- 1 root  system  6913743 Nov 16 05:05 archive2.tar.gz 
drwxr-xr-x 2 root  system   256 Nov 16 10:00 fgh*** 
[root]/foo/bar # /home/user/test.pl 
[root]/foo/bar # 

Rimozione del file> 2 GB (o globbing con "/ foo/bar/[ACF] / "istead di"/foo/bar// ")

[root]/foo/bar # ls -lrt 
drwxr-xr-x 2 root  system   256 Oct 11 2006 lost+found 
drwxr-xr-x 2 root  system   256 Dec 27 2007 abc*** 
drwxr-xr-x 2 root  system   256 Nov 12 15:32 cde*** 
-rw-r--r-- 1 root  system  6913743 Nov 16 05:05 archive2.tar.gz 
drwxr-xr-x 2 root  system   256 Nov 16 10:00 fgh*** 

[root]/foo/bar # /home/user/test.pl 
- /foo/bar/abc***/heapdump.phd.gz 
- /foo/bar/cde***/javacore.txt.gz 
- /foo/bar/fgh***/stuff.txt 
[root]/foo/bar # 

Qualsiasi suggerimento?

Sto lavorando con: Perl 5.8.8 Aix 5.3 Il filesystem è un jfs locale.

+1

È questo l'intero programma vero e proprio che ha dato il problema? L'unica ragione per cui sto chiedendo è che un 'glob' precedente potrebbe influenzare il ritorno di un' glob' successivo. – ikegami

+0

Il problema è venuto fuori con un codice più complesso, ma il problema è perfettamente replicato da questo snipplet. – roovalk

+0

puoi mostrare il più piccolo possibile banco di prova riproducibile con file di dati reali da qualche parte? – mvp

risposta

-3

Non ho mai usato la nuova funzione Glob, quindi non posso commentare vantaggi/problemi, ma sembra che molte persone abbiano avuto problemi ad usarlo: vedi =>https://stackoverflow.com/search?q=perl+glob&submit=search per alcune domande e possibili soluzioni.

SE non vi occupate di provare qualcosa di diverso: Qui è la mia soluzione collaudata perl 'vecchia scuola' ho usato in numerosi progetti:

my $path = "/foo/bar/"; 
my @result_array = qx(find $path -iname '*.txt'); #run the system find command 

Se - per qualsiasi ragione non preferiscono per eseguire un comando di sistema dall'interno dello script, quindi ricerca il costruito in Trova :: modulo Perl invece: http://search.cpan.org/~dom/perl-5.12.5/lib/File/Find.pm

buona fortuna

+2

"nuovo" come in quei nuovi telefoni cellulari mobili o in quella musica hip-hop? –

+0

'File :: Trova' è una buona raccomandazione; avresti dovuto guidare con quello. La tua soluzione "collaudata" non fa la stessa cosa che l'OP voleva. – dan1111

+0

trovo il downvote demotivante. E la tua affermazione che la mia soluzione proposta "... non fa la stessa cosa"? Per favore, spiega cosa pensi che la mia soluzione faccia, forse ho frainteso ciò che l'OP voleva fare.
E anche se ci siamo, perché non offrite una soluzione migliore? Quello sarebbe più costruttivo e tutti impareremmo nel processo. – Flow

4

in assenza di una risposta adeguata che si sta andando a voler un work-around . Suppongo che tu abbia riscontrato un bug specifico della piattaforma nell'implementazione glob() di 5.8.8

Ho avuto una rapida occhiata all'origine su CPAN ma la mia C è troppo arrugginita per individuare qualcosa di utile.

Tuttavia ci sono state molte modifiche a quel modulo, quindi un bug potrebbe essere stato segnalato e corretto. Non sei nemmeno sull'ultima versione di 5.8 - c'è una versione 5.8.9 che menziona gli aggiornamenti alla compatibilità AIX e File :: Glob.

Proverei questo installando local::lib se non lo hai già fatto e quindi forse cpanm e prova ad aggiornare File :: Glob - guarda cosa fa. Potrebbe essere necessario scaricare i file a mano da, ad es.here

Se ciò risolve il problema, è possibile distribuire gli aggiornamenti sui sistemi richiesti oppure è necessario implementare nuovamente i bit di glob() che si desidera. Che dipenderà dalla complessità dei tuoi schemi.

Se non risolve il problema, almeno si sarà in grado di incollare alcuni printf nel codice e vedere cosa sta facendo.

Si spera che qualcuno pubblichi una risposta reale e faccia questo ridondante circa 5 minuti dopo che ho fatto clic su "Pubblica la risposta".

+0

Grazie per i dettagli riguardanti la compatibilità Aix con Glob. Ad ogni modo penso che proverò con una diversa funzione incorporata. Questo script deve essere distribuito su un ampio numero (> 200) di macchine con ambienti leggermente diversi e con una giungla di patch/apar fix/etc. – roovalk