Perl tiene una utilidad muy pequeña llamada find2perl que traducirá (bastante fielmente) una línea de comandos para la utilidad Unix find
en una secuencia de comandos Perl para hacer lo mismo.Python equivalente a find2perl
Si usted tiene un comando find así:
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
Se encuentra todos los directorios que terminan en share
continuación /usr
Ahora ejecute find2perl /usr -xdev -type d -name '*share'
y se emitirá un script en Perl para hacer lo mismo. A continuación, puede modificar el script para su uso.
Python tiene os.walk()
que ciertamente tiene la funcionalidad necesaria, directorio recursivo listado, pero hay grandes diferencias.
Tome el caso simple de find . -type f -print
para encontrar e imprimir todos los archivos en el directorio actual. Una implementación ingenua usando os.walk()
sería:
for path, dirs, files in os.walk(root):
if files:
for file in files:
print os.path.join(path,file)
Sin embargo, esto producirá resultados diferentes de escribir find . -type f -print
en la cáscara.
También he estado probando diferentes os.walk() bucles en contra:
# 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 diferencia es que os.walk() cuenta enlaces como archivos; encontrar omite estos.
Así que una aplicación correcta de que es el mismo que se convierte en file . -type f -print
:
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)
Puesto que hay cientos de permutaciones de encontrar las primarias y diferentes efectos secundarios, esto se convierte en mucho tiempo para probar todas las variantes. Dado que find
es el estándar de oro en el mundo POSIX sobre cómo contar archivos en un árbol, hacerlo de la misma manera en Python es importante para mí.
¿Existe un equivalente de find2perl
que se pueda utilizar para Python? Hasta ahora he estado usando find2perl
y luego traduciendo manualmente el código de Perl. Esto es difícil porque los operadores de prueba de archivos Perl son different que las pruebas del archivo Python en os.path a veces.
yo sugeriría parte de la respuesta se puede conocer aquí: http://stackoverflow.com/questions/4639506/os- walk-with-regex Lo siento, no sé find/find2perl suficiente para ayudar más. * (quizás también http://stackoverflow.com/questions/5141437/filtering-os-walk-dirs-and-files)* –