¿Encuentra -exec ejecución en seco?

Dec 27 2020

¿Hay alguna manera de ver cuál sería el resultado de a find . -exec somecommand {} \;con sustituciones, sin ejecutar realmente los comandos? ¿Como una ejecución en seco (o prueba de ejecución o impresión)?

Por ejemplo, supongamos que tengo la siguiente estructura de archivos:

/a/1.txt
/a/2.txt
/a/b/3.txt

¿Hay alguna manera de probar find . type f -exec rm {} \;desde dentro del adirectorio de modo que la salida se imprima en stdout pero no se ejecute como:

rm 1.txt
rm 2.txt
rm b/3.txt

Nota de actualización : rmes solo un comando de ejemplo, estoy interesado en el caso general

Respuestas

18 rAlen Dec 27 2020 at 07:10

Puedes correr en echo rmlugar derm

find . type f -exec echo rm {} \;

Además, findtiene la -deleteopción de eliminar los archivos que encuentra.

3 l0b0 Dec 27 2020 at 07:28

Para rmconcreto, no es necesario -exec: sólo tiene que ejecutar find . -type fa la lista, y añadir -deletea eliminar los archivos listados por el comando anterior (obviamente si no hay archivos coincidentes siendo creados / borrados en el ínterin).

Además, para comandos como rmel que tomar un número arbitrario de argumentos que usted desee para reemplazar \;a +correr el menor número posible de comandos.

2 CharlesDuffy Dec 28 2020 at 00:38

Es un poco complicado, pero a diferencia de los enfoques que usan echo, el siguiente código de salida que puede ejecutar en su shell sin ningún cambio para tener el resultado correcto, incluso cuando sus nombres de archivo contienen comillas, espacios, metacaracteres de shell, etc.

printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
  somecommand {} \;

Tenga en cuenta que la cadena que estamos anteponiendo a nuestro -execargumento es precisamente bash -c "$(declare -f printcmd); "'printcmd "$@"' _: se $(declare -f printcmd)expande al código de la función; después de eso, en realidad llamamos a la función con argumentos $1y en adelante, y la colocamos _como marcador de posición para $0.

Puede sustituir zsho en kshlugar de bash, si desea que la salida se escape para ese shell.