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
- Beispiel.docx
- Dummydaten.doc
- Beispiel.doc
Ich möchte Sample.doc und Dummydata.docx löschen. Wie lösche ich die Dateien mit der -exec
Option? Kann ich die Namen der Dateien übergeben, z. rm Dummydata.docx Sample.doc
B. 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 {} after
rm` ü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 sh
Befehl wird der Pfad zu $0
und 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, echo
sobald Sie sicher sind, dass die richtige Datei entfernt wird. Aber ich fürchte, es ist einfacher, die Dateien einfach manuell zu entfernen.