Verwenden Sie GREP, um Inhalte in Dateien zu finden und sie zu verschieben, wenn sie übereinstimmen
Frage
Ich verwende Grep, um eine Liste von Dateien zu generieren, die ich verschieben muss:
grep -L -r 'Subject: \[SPAM\]' .
Wie kann ich diese Liste an den MV -Befehl übergeben und die Dateien woanders verschieben?
Lösung
grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR
Der -Z bedeutet nach den Dateinamen mit Nullen ( 0) Ausgabe (so werden Leerzeichen nicht als Abgrenzer verwendet).
xargs -0
bedeutet interpretieren 0, um Grenzwerte zu sein.
Dann
-I{} mv {} DIR
bedeutet ersetzen {}
Mit den Dateinamen, so dass Sie bekommen mv filenames DIR
.
Andere Tipps
Diese Alternative funktioniert, wenn Xargs nicht verfügbar ist:
grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done
Das verwende ich in Fedora Core 12:
grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
Das hat mir geholfen:
grep -lir 'spam' ./ | xargs mv -t ../spam
Natürlich war ich bereits im erforderlichen Ordner (deshalb ./
) und bewegte sie in den benachbarten Ordner. Aber Sie können sie auf alle Wege ändern.
Ich weiß nicht, warum die akzeptierte Antwort nicht funktioniert hat. Außerdem hatte ich keine Leerzeichen und Sonderzeichen in Dateinamen - vielleicht funktioniert dies nicht.
Hier gestohlen: GREP -Befehl, um Dateien zu finden, die eine Textzeichenfolge enthalten und verschieben
Vielleicht funktioniert das:
mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>
Angenommen, der von Ihnen geschriebene Grep gibt die von Ihnen erwarteten Dateienpfade zurück.
Es gibt verschiedene Möglichkeiten, aber hier ist eine langsame, aber fehlgeschlagene:
IFS=$'\n'; # set the field separator to line break
for $mail in $(grep -L -r 'Subject: \[SPAM\]' .); do mv "$mail" your_dir; done;
IFS=' '; # restore FS
Arbeit perfekt für mich:
Verschieben Sie Dateien, die den Text mit dem Wort mystringtoSearch enthalten, in das Verzeichnis mydir.
finden . -Type f -exec grep -il 'mystringtoSearch' {} ; -exec mv {} mydir/ ;
ich hoffe das hilft
Sie können das Ergebnis an den nächsten Befehl übergeben, indem Sie Grep ... | xargs mv {} Ziel
Weitere Informationen finden Sie in Man Xargs.