Verschieben Sie den Suchinhalt in ein anderes Verzeichnis

Verschieben Sie den Suchinhalt in ein anderes Verzeichnis

Ich verwende Oracle Solaris.

Ich benutze:

grep "searchstring" filename.*

Der obige Befehl gibt mein Suchergebnis zurück.

Jetzt möchte ich alle Dateien im obigen Suchergebnis (alle Dateien, nicht das Suchergebnis) in ein bestimmtes Verzeichnis verschieben ../mydir/.

Wie kann ich dies mit einem Befehl erreichen (Suchen und Verschieben sollten beide mit einem einzeiligen Befehl erfolgen).

Antwort1

Von ksh, bashoder /usr/xpg4/bin/sh, vorausgesetzt, dass die Dateinamen keine Zeilenumbruchzeichen enthalten, können Sie den Operator split+glob auf die Ausgabe von grep -l( anwenden, -lummsind die passenden Dateien).

Dieser Operator wird aufgerufen, indem manBefehlsersetzung( `...`oder $(...)) ohne Anführungszeichen. Hier passen wir es mit der $IFSspeziellen Variable an, um anzugeben, bei welchem ​​Zeichen wir teilen möchten (hier das Zeilenumbruchzeichen), und indem wir den globTeil mit deaktivieren set -f:

IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/

(wir stellen Globbing wieder herinnender Befehlssubstitution (die in einer Subshell ausgeführt wird) für die Erweiterung von filename*).

Sie können es folgendermaßen vereinfachen:

mv $(grep -l searchstring filename*) ../mydir/

Wenn Sie wissen , dass die Dateinamen keine Leerzeichen, Tabulatoren, Zeilenumbrüche oder Zeichen enthalten *. Oben erfolgt die Aufteilung nach Zeilenumbrüchen, Leerzeichen und Tabulatoren (was der Standardwert von ist ) und für jedes Wort, das sich aus dieser Aufteilung ergibt, wird Globbing ausgeführt (aber das ist kein Problem, wenn keiner der Dateinamen Platzhalterzeichen enthält).?[$IFS

Wenn Sie nicht garantieren können, dass die Dateinamen keine Zeilenumbruchzeichen enthalten, können Sie stattdessen eine Schleife verwenden:

for f in filename*; do
  grep -q searchstring "$f" && mv "$f" ../mydir/
done

verwandte Informationen