mv se queja de la entrada estándar en una canalización que filtra el nombre del archivo con grep

mv se queja de la entrada estándar en una canalización que filtra el nombre del archivo con grep

Estoy intentando mover varios archivos .avi que tienen espacios desde un CD a mi carpeta de inicio. Ya sé cómo deshacerme de los espacios:

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

Pero estoy luchando por moverme para encontrar los archivos editados y moverlos en masa a la carpeta. Sigo recibiendo el error mv: cannot stat '(standard input)': No such file or directory. Este es el código que estoy intentando usar:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

¿Alguien puede decirme qué estoy haciendo mal?

Respuesta1

Tu problema es el -Lcambio a grep. Desde la página de manual:

L, --files- without-match
Suprime la salida normal; en su lugar, imprima el nombre de cada archivo de entrada del cual normalmente no se habría impreso ninguna salida. El escaneo se detendrá en el primer partido.

Entonces, en lugar de enumerar losnombres de archivosque no coinciden avisolo enumera ellugardonde grepno lo encontré avi. Dado que grepnormalmente busca en un archivo, dicho modificador enumeraría los nombres de archivos que no contienen el patrón avidentro de ellos. En su caso, sin embargo, dado que está canalizando grepdesde find, el archivo que grepse está leyendo es (standard input). Para ver lo que quiero decir, intente:

find /media/mathscd | grep -L "*.avi"

resultado:

(standard input)

En otras palabras, grepse encontraron líneas que no coinciden "*.avi"en la entrada estándar, que es exactamente lo que sucedió.

Dado que findenumera los nombres de los archivos directamente, sólo necesita invertir el sentido de la coincidencia:

find /media/mathscd | grep -v ".*\.avi"

(tenga en cuenta que greplos patrones son diferentes de los comodines del shell; tampoco necesita el -rmodificador)

Además, usando findsolo:

find /media/mathscd ! -name "*.avi"

Respuesta2

Pruebe uno de estos:

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

Asegúrese de probarlo reemplazándolo xargs mv*con xargs lsel primero.

información relacionada