A veces veo el siguiente comando:
find . -name * -exec ls -a {} \;
Me pidieron que ejecutara esto.
¿Qué {} \;
significa aquí?
command-line
find
codeofnode
fuente
fuente
-name *
es redundante-name *
Es peor que redundante. Debido a*
que no está entre comillas, el shell lo expande a la lista de nombres de archivo en la carpeta actual, con espacios que se tratan incorrectamente, lo que genera resultados inesperados o un mensaje de error. Como punto extra,find
tiene muchas funciones, una de ellas es listar archivos; Esto evita tener que usar-exec
. Por ejemplo, puedes usarfind . -print
ofind . -ls
. Por último, hay dos maneras de escapar del punto y coma: o bien como lo hizo con la barra invertida,\;
o por citar:';'
. Use el que le resulte más cómodo.Respuestas:
Si ejecuta
find
conexec
, se{}
expande al nombre de archivo de cada archivo o directorio encontrado confind
(para quels
en su ejemplo obtenga cada nombre de archivo encontrado como argumento; tenga en cuenta que llamals
o cualquier otro comando que especifique una vez para cada archivo encontrado).Semicolon
;
finaliza el comando ejecutado porexec
. Debe escaparse\
para que el shell que ejecuta en sufind
interior no lo trate como su propio carácter especial, sino que se lo pasefind
.Vea este artículo para más detalles.
Además,
find
proporciona cierta optimización conexec cmd {} +
: cuando se ejecuta así,find
agrega los archivos encontrados al final del comando en lugar de invocarlo una vez por archivo (de modo que el comando se ejecuta solo una vez, si es posible).La diferencia en el comportamiento (si no es en eficiencia) se nota fácilmente si se ejecuta con
ls
, p. Ej.Suponiendo que tiene algunos
jpg
archivos (con rutas lo suficientemente cortas ), el resultado es una línea por archivo en el primer caso y ells
comportamiento estándar de mostrar archivos en columnas para el último.fuente
\;
con+
.find . -name * | ls -a -
?find
. Además, la salida dels
en este caso aparentemente no depende de la entrada; no importa lo que use como filtrofind
,ls
solo muestra el contenido del directorio de trabajo y eso es todo. Compruebe por ejemplofind ~ -iname '*.jpg' -exec ls -a {} \;
vsfind ~ -iname '*.jpg' | ls -a
.echo 'foo' | ls -a
.-
en tuls -a -
comando al probar lo que @ dr-h preguntó.Desde la página de manual para el
find
comando :Así que aquí está la explicación:
{}
significa "la salida defind
". Como en "lo que sea que sefind
encuentre".find
devuelve la ruta del archivo que estás buscando, ¿verdad? Entonces lo{}
reemplaza; es un marcador de posición para cada archivo quefind
localiza el comando (tomado de aquí ).La
\;
parte básicamente dicefind
"está bien, he terminado con el comando que quería ejecutar".Ejemplo:
Digamos que estoy en un directorio lleno de
.txt
archivos. Entonces corro:La primera parte,
find . -name *.txt
devuelve una lista de los.txt
archivos. La segunda parte,-exec cat {} \;
ejecutará elcat
comando para cada archivo encontrado porfind
, por lo quecat file1.txt
,cat file2.txt
y así sucesivamente.fuente
*.txt
debe ser citada como'*.txt'
. Esto se debe a que si hay.txt
archivos en la carpeta actual, el shell expandirá esto y obtendrá resultados incorrectos o un mensaje de error.find -name '*.txt' -exec cat {} \;