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.txt
y quiero llegarfile.txt
266
En GNU find
puede usar -printf
parámetros para eso, por ejemplo:
find /dir1 -type f -printf "%f\n"
-o
tiene menor precedencia que implicaba-a
, por lo que a menudo tendrá que agrupar sus-o
argumentos)Si su búsqueda no tiene una opción -printf, también puede usar basename:
fuente
... {} ';'
Uso
-execdir
que contiene automáticamente el archivo actual{}
, por ejemplo:También puede usar en
$PWD
lugar 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
./filename
lugar defilename
. Dependiendo de sus necesidades, puede o no estar bien.$PWD
lugar 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
basename
puede 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
xargs
la 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
-exec
y-execdir
son lentos,xargs
es rey.xargs
El paralelismo también ayuda.Curiosamente, no puedo explicar el último caso de
xargs
fuera-n1
. Da el resultado correcto y es el más rápido.¯\_(ツ)_/¯
(
basename
toma solo 1 argumento de ruta peroxargs
los 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
-execdir
ayuda, pero aún mucho más lento que un paraleloxargs
:fuente
find
es-execdir
que se convierte en el más rápido ya que crear nuevos procesos es una operación relativamente costosa.Honestamente
basename
ydirname
soluciones son más fáciles, pero también se puede comprobar esto:o
o
fuente
Como otros han señalado, puede combinar
find
ybasename
, pero de manera predeterminada, elbasename
programa solo funcionará en una ruta a la vez, por lo que el ejecutable tendrá que iniciarse una vez para cada ruta (usandofind ... -exec
ofind ... | xargs -n 1
), lo que puede ser lento.Si usa la
-a
opción activadabasename
, puede aceptar múltiples nombres de archivo en una sola invocación, lo que significa que puede usarxargs
sin 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
-print0
y-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 -a
yxargs -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).cksum
en 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
basename
cada vez.fuente
basename
aceptará múltiples nombres de archivos sin necesidad de argumentos adicionales en la línea de comandos. El uso de-a
aquí está en Linux. (basename --version
me 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