¿Encuentra -exec ejecución en seco?
¿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
Puedes correr en echo rmlugar derm
find . type f -exec echo rm {} \;
Además, findtiene la -deleteopción de eliminar los archivos que encuentra.
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.
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.