Perl ha una piccola utility chiamata find2perl che tradurrà (abbastanza fedelmente) una riga di comando per l'utilità Unix find
in uno script Perl per fare lo stesso.Equivalente Python di find2perl
Se si dispone di un comando find come questo:
find /usr -xdev -type d -name '*share'
^^^^^^^^^^^^ => name with shell expansion of '*share'
^^^^ => Directory (not a file)
^^^ => Do not go to external file systems
^^^ => the /usr directory (could be multiple directories
Essa trova tutte le directory che terminano in share
sotto /usr
Ora lanciate find2perl /usr -xdev -type d -name '*share'
ed emetterà uno script Perl a fare lo stesso. È quindi possibile modificare lo script per l'uso.
Python ha os.walk()
che ha certamente la funzionalità necessaria, ricorsivo elenco di directory, ma ci sono grandi differenze.
Prendere il caso semplice di find . -type f -print
per trovare e stampare tutti i file nella directory corrente. Un'implementazione naive usando os.walk()
sarebbe:
for path, dirs, files in os.walk(root):
if files:
for file in files:
print os.path.join(path,file)
Tuttavia, questo produrrà risultati diversi che digitare find . -type f -print
nel guscio.
Sono stato anche testato vari os.walk() loop contro:
# create pipe to 'find' with the commands with arg of 'root'
find_cmd='find %s -type f' % root
args=shlex.split(find_cmd)
p=subprocess.Popen(args,stdout=subprocess.PIPE)
out,err=p.communicate()
out=out.rstrip() # remove terminating \n
for line in out.splitlines()
print line
La differenza è che os.walk() conta link come file; trovare li salta.
Quindi una corretta applicazione che è lo stesso di file . -type f -print
diventa:
for path, dirs, files in os.walk(root):
if files:
for file in files:
p=os.path.join(path,file)
if os.path.isfile(p) and not os.path.islink(p):
print(p)
Dal momento che ci sono centinaia di permutazioni di trovare primarie e diversi effetti collaterali, questo diventa molto tempo per provare tutte le varianti. Dal find
è il gold standard nel mondo POSIX su come contare i file in un albero, farlo nello stesso modo in Python è importante per me.
Quindi esiste un equivalente di find2perl
che può essere utilizzato per Python? Finora ho appena usato find2perl
e poi manualmente la traduzione del codice Perl. Questo è difficile perché gli operatori di test del file Perl sono different rispetto ai test dei file Python in os.path a volte.
Io suggerirei parte della risposta potrebbe essere trovato qui: http://stackoverflow.com/questions/4639506/os- walk-with-regex Spiacente, non so find/find2perl abbastanza per aiutare di più. * (forse anche http://stackoverflow.com/questions/5141437/filtering-os-walk-dirs-and-files)* –