Wie verschiebe ich alle von einem Befehl ausgegebenen Dateien?

22

Ich habe diesen grep-Befehl, um Dateien ohne das Wort Attachments in ihnen zu finden.

grep -L -- Attachments *

Ich möchte alle Dateien verschieben, die von diesem Befehl ausgegeben werden. Wie mache ich das in bash? Benutze ich eine Pfeife? Benutze ich eine wortreichere if / then-Anweisung in einem vollständigen Skript?

bernie2436
quelle

Antworten:

18

Wenn Sie wissen, dass keiner der Dateinamen neue Zeilen, Tabulatoren, Leerzeichen oder Glob-Kombinationen enthält, die möglicherweise zu einer Übereinstimmung führen, ist dies für einen Einzelfall möglicherweise einfacher:

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

Sie möchten eine Pipe und die Option greps verwenden -Z:

Mit GNU grep und mv

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

Die -ZKombination mit xargs -0behandelt alle Dateinamen mit Sonderzeichen.

Verwenden von BSD grep und mv (wie unter MacOS X)

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

Unter BSD grep -Zbedeutet dekomprimieren und grep --nullfunktioniert sowohl unter BSD als auch unter GNU. BSD mvfehlt die Option-t

Anthon
quelle