¿Cómo muevo todos los archivos de salida de un comando?

22

Tengo este comando grep para buscar archivos sin la palabra Adjuntos en ellos.

grep -L -- Attachments *

Quiero mover todos los archivos que salen de ese comando. ¿Cómo hago eso en bash? ¿Utilizo una pipa? ¿Utilizo una declaración if / then más prolija en un script completo?

bernie2436
fuente

Respuestas:

18

Si sabe que ninguno si los nombres de archivo contienen nuevas líneas, tabulaciones, espacios o combinaciones globales que pueden producir una coincidencia, esto puede ser más fácil para un caso único:

mv $(grep -L Attachments *) dest_dir
Graeme
fuente
36

Lo que quieres hacer es usar una opción de tubería y greps -Z:

Usando GNU grep y mv

grep -LZ -- Attachments * | xargs -0 mv -t target_directory

El -Zcombinado con xargs -0maneja cualquier nombre de archivo con caracteres especiales.

Usando BSD grep y mv (como en MacOS X)

grep -L --null -- Attachments * |
while IFS= read -r -d "" file; do 
    mv "./$file" target_directory
done

En BSD, grep -Zsignifica descomprimir , grep --nullfunciona tanto en BSD como en GNU. BSD mvcarece de opción-t

Anthon
fuente