
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
, bash
oder /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, -l
ummsind die passenden Dateien).
Dieser Operator wird aufgerufen, indem manBefehlsersetzung( `...`
oder $(...)
) ohne Anführungszeichen. Hier passen wir es mit der $IFS
speziellen Variable an, um anzugeben, bei welchem Zeichen wir teilen möchten (hier das Zeilenumbruchzeichen), und indem wir den glob
Teil 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