So löschen Sie alle Dateien, die von locate zurückgegeben werden

13

Im Moment ist es was ich tue:

Schritt 1:

locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar

Schritt 2:

Führen Sie manuell eine Entfernung durch, indem Sie jede Zeile kopieren und einfügen.

rm /home/abc/fooBar
rm /home/abc/Music/fooBar

Wie mache ich das in einem Schritt? Etwas wie

Suchen Sie fooBar> rm

Vielen Dank.

theTuxRacer
quelle
Willst du das? rm -i locate fooBar``
LFC_fan
Ich bin nicht sicher, was das oben genannte tut. Ich möchte nur alle Dateien aus den Pfaden entfernen, die zurückgegeben werden, wenn ich einen locate-Befehl ausführe.
theTuxRacer

Antworten:

13

Wie die anderen schon erwähnt haben, ist xargs dein Freund. Es ist ein sehr leistungsfähiges Tool und ich werde versuchen, es zu erklären und eine Problemumgehung für einen allgemeinen Fall zu bieten.

Xargs übernimmt eine Zeile aus der Eingabe und hängt sie an einen anderen Befehl an, wobei dieser andere Befehl für jede Zeile in der Eingabe ausgeführt wird. Wenn Sie also tippen locate foobar | xargs rm -f, wird die Ausgabe des Befehls locate an das Ende des rm -fBefehls angehängt und für jede von erzeugte Zeile ausgeführt locate foobar.

Die gotcha:

Aber was ist, wenn Ihre von locate zurückgegebenen Zeilen Leerzeichen enthalten? Dadurch wird der rm -fBefehl abgebrochen, da die an rm übergebenen Argumente Dateien sein müssen (es sei denn, Sie verwenden die Option -r) und ein Dateipfad in Anführungszeichen gesetzt werden muss, wenn er Leerzeichen enthält.

xargs stellt den Schalter -i bereit, um die Eingabe in den folgenden Befehl zu ersetzen , anstatt sie nur anzuhängen. Also würde ich den Vorschlag auf ändern

locate foobar | xargs -ixxx rm -f 'xxx'

Dies funktioniert nur, wenn die von locate zurückgegebenen Dateinamen Apostrophe enthalten.

Ich muss mit qbi übereinstimmen, dass Sie vorsichtig mit rm -f sein sollten ! Verwenden Sie das Flag -p, um xargs zu laden, oder führen Sie einfach die locate foobar selbst aus, bevor Sie xargs damit versorgen, oder lassen Sie -f von rm fallen.

locate foobar | xargs -p -ixxx rm -f 'xxx'
finley
quelle
9
Um Dateien mit exotischen Zeichen (Zeilenumbrüche, Anführungszeichen, Apostrophe usw.) im Namen zu widerstehen, können Sie die Option -0( --null) verwenden, um nach xargs zu suchen. Hierbei wird das sichere ASCII-NUL-Zeichen zum Trennen von Dateinamen verwendet:locate -0 foobar | xargs -0 rm
Jukka Matilainen
1
+1 für die Antwort und ausgewählt zum Erwähnen des gotcha ^ _ ^
theTuxRacer
Ich habe es versucht, aber es hat nicht funktioniert.
Pronoy999
Teilweise gearbeitet
SteveS
7

Möglicherweise benötigen Sie weitere Optionen zur Verwendung mit xargs. Testen Sie es zuerst mit xargs -p. Wenn es in Ordnung ist, entfernen Sie die -pOption:

locate foobar | xargs rm
qbi
quelle
6

Geben Sie den folgenden Befehl in Ihrem Terminal ein, um alle von locate zurückgegebenen Dateien zu löschen

locate foobar | xargs rm -f

karthick87
quelle