Pipe Ergebnisse der Lokalisierung in rm

11

Ich habe versucht zu rennen

locate *.orig | xargs rm

aber es sagte No such file or directory

Ich habe Möglichkeiten gesehen, dies zu tun, findaber find gibt den vollständigen Pfad zum Objekt zurück, sodass dies möglich sein sollte

soldat.motte
quelle

Antworten:

20

Wenn Dateinamen Leerzeichen enthalten, sollten Sie diese verwenden

locate -0 $something | xargs -0 rm

Von der locateManpage :

-0, --nullTrennen Sie die Einträge bei der Ausgabe mit dem ASCII-NUL-Zeichen, anstatt jeden Eintrag in eine separate Zeile zu schreiben. Diese Option wurde für die Interoperabilität mit der Option --null von GNU xargs (1) entwickelt.

oder

locate $something | while read f; do rm "$f"; done

Außerdem sollten Sie *.origmit Anführungszeichen schützen , um die Shell-Erweiterung zu vermeiden, und sie an unberührte Stellen weitergeben.

Enzotib
quelle
Was meinst du mit "Shell-Erweiterung"?
soldat.moth
+1 für Ihr zweites Beispiel. Ich benutze immer, | while readda mein Home-Verzeichnis voller Dateien mit Leerzeichen ist.
Matpie
@ Soldier.moth: Wenn sich im aktuellen Ordner Dateien befinden, die dem Muster entsprechen *.orig, erweitert die Shell das Muster beispielsweise auf file1.orig file2.orig ..., sodass locatedie genaue Zeichenfolge nicht *.origwie gewünscht angezeigt wird .
Enzotib
Auch um grep die Ausgabe zu lokalisieren, können Sie dann tr '\n' '\0'.
Pablo Bianchi
2

Es ist xargsnichtxarg

Maco
quelle
Das war es, was ich damit meinte, eine Frage aus dem Gedächtnis zu tippen. Danke.
soldat.moth
Oh ok. Es sah aus wie der Fehler, bei dem Sie nach | einen falschen Befehl eingeben würden
Maco
0

Der Befehl locate *.orig | xargs rmfunktioniert tatsächlich aber was geschieht , dass locatewar die Suche nach *.origDateien in dem Papierkorb und rmspuckt den Fehler No such file or directorybei dem Versuch , Dateien in dem Papierkorb zu löschen.

soldat.motte
quelle
Sie sollten der ursprünglichen Antwort Informationen als "Kommentar" hinzufügen, oder Sie können die ursprüngliche Antwort bearbeiten. Dies ist keine Antwort auf Ihre eigene Frage.
Enzotib
Es ist eine Antwort auf meine Frage. Der Grund, warum ich den Fehler erhielt, war, dass locate * .orig-Dateien im Papierkorb gefunden hat und rm sie nicht löschen konnte. Ich habe Ihre Antwort akzeptiert und beide anderen Antworten abgestimmt, weil sie gut geschrieben waren und jemandem helfen könnten, der später kommt.
soldat.moth
0

lococate macht das Globbing nicht, aber die Shell. Die Shell erweitert * .orig auf das, was sie im aktuellen Verzeichnis findet, das mit * .orig übereinstimmt.

Benutz einfach

locate .orig

und wenn das dir bringt was du brauchst

locate .orig | xargs rm

oder, wie Enzotib erwähnt

locate -0 .orig | xargs -0 rm

Wenn Sie Whitespace in den Dateinamen haben.

Benutzer unbekannt
quelle
0

Ein Trick: Speichern Sie alle Pfade in der tmp-Datei. dann Schleife drauf:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

rm -rf /tmp/tmp.txt 
Abdennour TOUMI
quelle