Estoy usando find para todos los archivos en el directorio, así que obtengo una lista de rutas. Sin embargo, solo necesito nombres de archivo. es decir, consigo ./dir1/dir2/file.txty quiero llegarfile.txt
266
En GNU findpuede usar -printfparámetros para eso, por ejemplo:
find /dir1 -type f -printf "%f\n"
-otiene menor precedencia que implicaba-a, por lo que a menudo tendrá que agrupar sus-oargumentos)Si su búsqueda no tiene una opción -printf, también puede usar basename:
fuente
... {} ';'Uso
-execdirque contiene automáticamente el archivo actual{}, por ejemplo:También puede usar en
$PWDlugar de.(en algunos sistemas no producirá un punto extra en el frente).Si aún tiene un punto extra, también puede ejecutar:
Cuando se usa en
+lugar de;,{}se reemplaza con la mayor cantidad de rutas posibles para cada invocación de la utilidad. En otras palabras, imprimirá todos los nombres de archivo en una línea.fuente
./filenamelugar defilename. Dependiendo de sus necesidades, puede o no estar bien.$PWDlugar de..Si está utilizando GNU encuentre
O puede usar un lenguaje de programación como Ruby (1.9+)
Si te apetece una solución bash (al menos 4)
fuente
Si desea ejecutar alguna acción solo contra el nombre del archivo, el uso
basenamepuede ser difícil.Por ejemplo esto:
solo hará eco de nombre base
/my/found/path. No es lo que queremos si queremos ejecutar el nombre del archivo.Pero puedes entonces
xargsla salida. por ejemplo, para eliminar los archivos en un directorio basado en nombres en otro directorio:fuente
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \;En mac (BSD
find) use:fuente
-execy-execdirson lentos,xargses rey.xargsEl paralelismo también ayuda.Curiosamente, no puedo explicar el último caso de
xargsfuera-n1. Da el resultado correcto y es el más rápido.¯\_(ツ)_/¯(
basenametoma solo 1 argumento de ruta peroxargslos enviará a todos (en realidad 5000) sin-n1. no funciona en Linux y OpenBSD, solo macOS ...)Algunos números más grandes de un sistema Linux para ver cómo
-execdirayuda, pero aún mucho más lento que un paraleloxargs:fuente
findes-execdirque se convierte en el más rápido ya que crear nuevos procesos es una operación relativamente costosa.Honestamente
basenameydirnamesoluciones son más fáciles, pero también se puede comprobar esto:o
o
fuente
Como otros han señalado, puede combinar
findybasename, pero de manera predeterminada, elbasenameprograma solo funcionará en una ruta a la vez, por lo que el ejecutable tendrá que iniciarse una vez para cada ruta (usandofind ... -execofind ... | xargs -n 1), lo que puede ser lento.Si usa la
-aopción activadabasename, puede aceptar múltiples nombres de archivo en una sola invocación, lo que significa que puede usarxargssin el-n 1, para agrupar las rutas en un número mucho menor de invocacionesbasename, lo que debería ser más eficiente.Ejemplo:
Aquí he incluido el
-print0y-0(que deben usarse juntos), para hacer frente a cualquier espacio en blanco dentro de los nombres de archivos y directorios.Aquí hay una comparación de tiempos, entre las versiones
xargs basename -ayxargs -n1 basename. (En aras de una comparación de igual a igual, los tiempos que se informan aquí son posteriores a una ejecución ficticia inicial, de modo que ambos se realizan después de que los metadatos del archivo ya se hayan copiado en la caché de E / S).cksumen ambos casos, solo para demostrar que la salida es independiente del método utilizado.Como puede ver, es mucho más rápido evitar el lanzamiento
basenamecada vez.fuente
basenameaceptará múltiples nombres de archivos sin necesidad de argumentos adicionales en la línea de comandos. El uso de-aaquí está en Linux. (basename --versionme dicebasename (GNU coreutils) 8.28)He encontrado una solución (en la página de makandracards), que da solo el nombre de archivo más reciente:
(gracias a Arne Hartherz)
Lo usé para
cp:fuente