Un comando -exec
se debe terminar con un ;
(por lo que en general tienen que escribir o \;
';'
para evitar interpretion por el shell) o una +
. La diferencia es que con ;
, el comando se llama una vez por archivo, con +
, se llama tan pocas veces como sea posible (generalmente una vez, pero hay una longitud máxima para una línea de comando, por lo que puede dividirse) con todos los nombres de archivo. Vea este ejemplo:
$ cat /tmp/echoargs
#!/bin/sh
echo $1 - $2 - $3
$ find /tmp/foo -exec /tmp/echoargs {} \;
/tmp/foo - -
/tmp/foo/one - -
/tmp/foo/two - -
$ find /tmp/foo -exec /tmp/echoargs {} +
/tmp/foo - /tmp/foo/one - /tmp/foo/two
Su comando tiene dos errores:
En primer lugar, se utiliza {};
, pero el ;
debe ser un parámetro propio.
En segundo lugar, el comando finaliza en el &&
. Usted especificó "ejecutar buscar, y si eso fue exitoso, elimine el archivo llamado {};
". Si desea utilizar elementos de shell en el comando -exec
, debe ejecutarlo explícitamente en un shell, como -exec sh -c 'ffmpeg ... && rm'
.
Sin embargo, no debe agregar el {} dentro del comando bash, se producirán problemas cuando haya caracteres especiales. En cambio, puede pasar parámetros adicionales a la cáscara después de -c command_string
(ver man sh
):
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
Ves lo $
es evaluada por el shell en el primer ejemplo.Imagínese que había un archivo llamado $(rm -rf /)
:-)
(Nota al margen: El -
no es necesaria, pero la primera variable después de la orden se asigna a la variable $0
, que es una variable especial, que normalmente contiene el nombre del programa siendo dirigido y estableciendo que a un parámetro es un poco sucio, a pesar de que no causará ningún daño aquí, probablemente, por lo que establecer que sólo -
y empezar con $1
.)
así que su comando podría ser algo así como
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;
Pero hay una mejor manera. encuentra soportes and
y or
, por lo que puede hacer cosas como find -name foo -or -name bar
. Pero eso también funciona con -exec
, que se evalúa como verdadero si el comando sale exitosamente, y para falso si no. Vea este ejemplo:
$ ls
false true
$ find * -exec {} \; -and -print
true
sólo se realiza la impresión si el comando fue con éxito, lo que lo hizo para true
pero no para false
.
Así que puede usar dos instrucciones ejecutivas encadenadas con un -and
, y solo ejecutará el último si el primero se ejecutó correctamente.
¿No está seguro de si eliminará la variable del archivo? Alguien sabe si este es el caso? – Abs
Para probar tales cosas simplemente agregue un 'echo' antes de los comandos y vea lo que hace. – Marian