¿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 a
directorio 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 : rm
es solo un comando de ejemplo, estoy interesado en el caso general
Respuestas
Puedes correr en echo rm
lugar derm
find . type f -exec echo rm {} \;
Además, find
tiene la -delete
opción de eliminar los archivos que encuentra.
Para rm
concreto, no es necesario -exec
: sólo tiene que ejecutar find . -type f
a la lista, y añadir -delete
a 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 rm
el 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 -exec
argumento 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 $1
y en adelante, y la colocamos _
como marcador de posición para $0
.
Puede sustituir zsh
o en ksh
lugar de bash, si desea que la salida se escape para ese shell.