¿Cómo ejecuto varios comandos cuando uso buscar?

¿Cómo ejecuto varios comandos cuando uso buscar?

Estoy intentando ejecutar varios comandos en cosas que encontré, ¿cómo puedo lograrlo?

find . -exec cmd1; cmd2

no parece funcionar; en su lugar, ejecuta cmd2 después de que se haya ejecutado cmd1 en cada archivo.

Respuesta1

En esta demostración, usaré sh -c 'echo first; false'(o true) para el primero -exec. Eso dará algo de resultado y también tendrá el efecto del código de salida seleccionado. Luego echo secondse utilizará para el segundo. Supongamos que hay un archivo en el directorio actual.

$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second

Un comando real de este tipo sería así:

find . -type f \( -exec command1 \; -false -o -exec command2 \; \)

En el segundo conjunto, los paréntesis con escape agrupan las dos -execcláusulas. La -falserelación entre ellos fuerza el estado de la prueba a "falso" y -ohace que la siguiente expresión (la segunda -exec) se evalúe debido a -false.

De man find:

expr1 expr2
Se considera que dos expresiones seguidas se unen con un "y" implícito; expr2 no se evalúa si expr1 es falso.

expr1 -a expr2
Igual que expr1 expr2.

expr1 -o expr2
O; expr2 no se evalúa si expr1 es verdadero.

Respuesta2

Si no le importa que cmd1 pueda evitar que se ejecute cmd2 debido al código de error 0:

find . -exec cmd1 \; -exec cmd2 \;

La única forma confiable de hacer que ambos comandos se ejecuten siempre es invocar findun shell que posteriormente ejecutará los comandos en secuencia:

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;

Respuesta3

Si no te importa crear un script que haga cmd1 y cmd2, entonces es solo esto:

find . -exec myscript {} \;

o

find . -exec myscript {} +

Usar \; o + dependiendo de si myscript puede manejar más de un archivo a la vez (se vuelve complicado si hay espacios en los nombres de archivos, etc.).

Poner lo que estabas haciendo en un guión, según mi experiencia, casi siempre ha valido la pena. Si tienes que hacerlo una vez, tendrás que hacerlo de nuevo.

Pero un buen truco es poner el hallazgoadentrola secuencia de comandos:

if [ $# -gt 0 ]; then
    for each; do
        touch $each
    done
else
    find . -exec $0 {} +
fi

Luego myscript funciona en cualquier archivo que usted le dé como argumentos para que funcione, pero si no le da ningún argumento, ejecuta la búsqueda desde el directorio actual y luego se llama a sí mismo en los archivos encontrados. Esto evita el hecho de que find -exec no puede llamar a funciones de shell que haya definido en su script.

Respuesta4

prueba el comando:

sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l

información relacionada