Wie kann ich mit dem Find-Befehl in Linux eine bestimmte Datei aus einem Ergebnissatz löschen?

Wie kann ich mit dem Find-Befehl in Linux eine bestimmte Datei aus einem Ergebnissatz löschen?

Ich habe den folgenden Befehl, der alle Dateien mit der Erweiterung doc, docx, usw. auflistet.

find . -maxdepth 1 -iname \*.doc\*

Der Befehl gibt zahlreiche Dateien zurück, von denen ich einige löschen möchte. Die zurückgegebenen Ergebnisse sind beispielsweise

  1. Beispiel.docx
  2. Dummydaten.doc
  3. Beispiel.doc

Ich möchte Sample.doc und Dummydata.docx löschen. Wie lösche ich die Dateien mit der -execOption? Kann ich die Namen der Dateien übergeben, z. rm Dummydata.docx Sample.docB. würde der Befehl dann wie folgt aussehen

find . -maxdepth 1 -iname \*.doc\* -exec rm Dummydata.docx Sample.doc

Kann ich die Namen der Dateien innerhalb von {} afterrm` übergeben? zB

find . -maxdepth 1 -iname \*.doc\* -exec rm {Dummydata.docx} Sample.doc

Gibt es eine bessere Möglichkeit, dies zu tun?

Antwort1

Wenn Sie die Namen der Dateien im Voraus kennen, ist es einfacher, sie sofort zu entfernen:

find . -iname "Dummydata.doc" -delete

Oder bei mehreren Bedingungen:

find . \( -iname "Dummydata.doc" -o -iname "Sample.doc" \)

Die Klammern erzwingen die Präferenz, Sie müssen sie jedoch maskieren oder in Anführungszeichen setzen, da Klammern für Ihre Shell normalerweise eine besondere Bedeutung haben.


Wenn Sie hingegen zuerst die Ergebnisliste untersuchen möchten, können Sie den Pfad der gefundenen Dateien – hier „put into“ {}– an übergeben sh. Für den shBefehl wird der Pfad zu $0und Sie können ihn mit dem Namen der Datei vergleichen, die Sie entfernen möchten:

find . -maxdepth 1 -iname "*.doc" \
-exec sh -c 'if [ "$0" == "Dummydata.doc" ] || [ "$0" == "Sample.doc" ]; then echo rm "$0"; fi' {} \;

Entfernen Sie hier, echosobald Sie sicher sind, dass die richtige Datei entfernt wird. Aber ich fürchte, es ist einfacher, die Dateien einfach manuell zu entfernen.

verwandte Informationen