missing argument bash shell find arguments exec

bash - missing - encontrar: falta un argumento para-exec



find exec rm (9)

Además, si alguien más tiene el "find: missing argument to -exec", esto podría ayudar:

En algunos shells no necesitas escaparte, es decir, no necesitas el "/" delante del ";"

find <file path> -name "myFile.*" -exec rm - f {} ;

Me ayudaron hoy con un comando, pero parece que no funciona. Este es el comando:

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {}/;

El caparazón regresa

find: missing argument to `-exec''

Lo que básicamente trato de hacer es ir a través de un directorio recursivamente (si tiene otros directorios) y ejecutar el comando ffmpeg en los tipos de archivos .rm y convertirlos a tipos de archivo .mp3 . Una vez hecho esto, elimine el archivo .rm que acaba de convertir.

Agradezco cualquier ayuda en esto.


El comando A -exec debe terminarse con a ; (por lo tanto, generalmente necesita escribir /; o '';'' para evitar la interpretación por parte del shell) o un + . 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. Mira 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

Tu comando tiene dos errores:

Primero, usas {}; , pero el ; debe ser un parámetro propio.

Segundo, el comando termina en el && . Usted especificó "ejecutar búsqueda, y si eso fue exitoso, elimine el archivo llamado {}; . ". Si desea usar material de shell en el comando -exec , debe ejecutarlo explícitamente en un shell, como -exec sh -c ''ffmpeg ... && rm'' .

Sin embargo, no debe agregar {} dentro del comando bash, sino que producirá problemas cuando haya caracteres especiales. En su lugar, puede pasar parámetros adicionales al shell 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.)

Verá que $ lo evalúa el shell en el primer ejemplo. Imagina que hay un archivo llamado $(rm -rf /) :-)

(Nota al margen: El - no es necesario, pero la primera variable después de que el comando se asigna a la variable $0 , que es una variable especial que normalmente contiene el nombre del programa que se está ejecutando y establecerla en un parámetro es un poco sucio, aunque probablemente no cause ningún daño aquí, así que lo configuramos solo y comenzamos con $1 ).

Entonces tu 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. encuentre apoyos yy or , para que pueda 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. Mira este ejemplo:

$ ls false true $ find * -exec {} /; -and -print true

Solo ejecuta la impresión si el comando fue exitoso, lo que hizo para true pero no para false .

De modo que puede usar dos sentencias ejecutivas encadenadas con un -and , y solo ejecutará el último si el primero se ejecutó con éxito.


En caso de que alguien vea una similar "missing -exec args" en los scripts de Amazon Opsworks Chef bash, necesito agregar otra barra invertida para escapar de la /;

bash ''remove_wars'' do user ''ubuntu'' cwd ''/'' code <<-EOH find /home/ubuntu/wars -type f -name "*.war" -exec rm {} //; EOH ignore_failure true end


Intenta poner un espacio antes de cada /;

Trabajos:

find . -name "*.log" -exec echo {} /;

No funciona:

find . -name "*.log" -exec echo {}/;


Lo descubrí ahora. Cuando necesite ejecutar dos comandos en el ejecutivo en un hallazgo, necesita tener dos ejecutivos independientes. Esto finalmente funcionó para mí.

find . -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 /; -exec rm {} /;


Necesitas escaparte, creo.

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} /-sameq {}.mp3 /&/& rm {}/;


Si aún obtiene "find: missing argument to -exec", intente envolver el argumento execute entre comillas.

find <file path> -type f -exec "chmod 664 {} /;"


Solo para tu información:
Acabo de intentar usar el comando "find -exec" en un sistema Cygwin (emulado UNIX en Windows), y parece que la barra invertida antes del punto y coma debe eliminarse:
find ./ -name "blabla" -exec wc -l {} ;


Tanto {} como && causarán problemas debido a la expansión por la línea de comando. Sugeriría probar:

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i /{} -sameq /{}.mp3 /; -exec rm /{} /;