GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo ejecuto múltiples comandos cuando uso find?

En esta demostración, usaré sh -c 'echo first; false' (o true ) para el primer -exec . Eso dará alguna salida y también tendrá el efecto del código de salida seleccionado. Entonces echo second se usará para el segundo. Suponga 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 se vería así:

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

En el segundo conjunto, los paréntesis escapados agrupan los dos -exec cláusulas. El -false entre ellos fuerza el estado de prueba a "falso" y el -o provoca la siguiente expresión (la segunda -exec ) para ser evaluado debido al -false .

Desde man find :

expr1 expr2
Dos expresiones seguidas se consideran unidas 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.


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 ejecuten siempre esto es tener find invoque un shell que posteriormente ejecutará los comandos en secuencia:

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

Si no le importa hacer 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 complica si hay espacios en los nombres de archivo, etc.).

Poner lo que estabas haciendo en un guión, en 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 hallazgo dentro el guión:

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

Luego, myscript funciona en cualquier archivo que proporcione como argumentos para que funcione, pero si no le da ningún argumento, ejecuta find 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 las funciones de shell que ha definido en su secuencia de comandos.


Linux
  1. ¿Cómo encontrar múltiples cadenas en archivos?

  2. Tutorial de Unix Sed:cómo ejecutar múltiples comandos Sed

  3. Cómo configurar Nginx para ejecutar PHP usando PHP-FPM

  4. ¿Cómo puedo ejecutar una serie de comandos en una subcapa bash como otro usuario que usa sudo?

  5. ¿Cómo encuentra al usuario original a través de múltiples comandos sudo y su?

Cómo ejecutar comandos de Linux en un sistema remoto a través de SSH

Cómo encontrar archivos usando la línea de comandos en la terminal de Linux

Cómo mostrar hojas de trucos de comandos de Linux usando, por ejemplo

Cómo editar varios archivos usando Vim Editor

Cómo controlar Vagrant Box usando comandos de Vagrant

¿Cómo eliminar varias carpetas en paralelo?