Kurz gesagt, ich habe einen Ordner mit fast 800.000 PHP-Dateien. Ich möchte jede Datei nach einer Zeichenfolge durchsuchen und wenn diese in der Datei vorhanden ist, wird die Datei in ein anderes Verzeichnis kopiert.
Ist dies vom Terminal aus möglich?
Bisher habe ich:
grep -i -n -r 'ppr-1792' * | cp $1 hierher_verschieben
Aber das funktioniert offensichtlich nicht. $1 muss der Dateiname sein, der den passenden Text enthält.
Was soll ich machen?
Antwort1
Sie können eine For-Schleife verwenden und den Rückgabecode von grep testen oder grep -c
(Übereinstimmungen zählen) verwenden und prüfen, ob die Anzahl der Übereinstimmungen größer als 1 ist.
z.B
for i in *
do
grep -i -n 'Power' "$i"
if [ "$?" -eq 0 ]
then
cp "$i" mvd
fi
done
Antwort2
Das geht ganz einfach mit einem schönen Einzeiler:
grep -l -i -r -Z pattern | xargs -0 -I source cp source /target
Einige Kommentare zur Funktionsweise. Die Option -l von Grep druckt nur einen Dateinamen, wenn es eine Übereinstimmung in der Datei gibt, sodass eine Liste der zu kopierenden Dateien erstellt wird. Der Befehl Xargs erstellt für jeden Kopierbefehl einen Befehl und führt ihn aus. Xargs ersetzt das Argument mit dem Namen „source“ durch einen Dateinamen, der von der Standardeingabe gelesen wird. Leerzeichen und andere merkwürdige Zeichen in Dateinamen werden mit den Optionen -Z und -0 behandelt.