Ich möchte Dateien ohne Suffix finden und löschen. Wie machst Du das?

0

Ich möchte alle Dateien aus einem Ordner und seinen Unterordnern mit einer bestimmten Eigenschaft suchen und löschen: dass sie kein Suffix mit drei Buchstaben haben. Wie machst Du das? Vielen Dank.

user274611
quelle

Antworten:

3

TL; DR; (was eine wirklich schlechte Idee ist, wenn man automatisch Sachen löscht)

find . ! -name "*.???" -type f -max-depth 1 -delete


Richtig erklärt und getestet:

Schritt 0: Einrichten der Testumgebung:

mkdir test
cd test
touch test1
touch test1.bar
touch test1.foo
touch test1.baz
touch test1.bazar

Schritt 1: Finden Sie alle Dateien mit einer Erweiterung von drei Buchstaben:

find . -name "*.???" -type f -print
./test1.bar
./test1.baz
./test1.foo

Schritt 2: Auswahl umkehren

find . ! -name "*.???" -type f -print
./test1
./test1.bazar

Schritt 3: Ersetzen Sie den -printdurch -delete.

Wenn Sie nicht in Unterverzeichnisse wechseln möchten, fügen Sie a hinzu -max-depth=1

Hennes
quelle
1
Ich denke, dass die Option maxdepth vor allen anderen Optionen angezeigt werden soll (sie verursacht keine tatsächlichen Probleme, wird aber zumindest bei GNU find einen Fehler auslösen). Ist es nicht auch -maxdepth 1, oder ist dies eines dieser Dinge mit mehrfach gültiger Syntax?
Übelsuppe
Wahrscheinlich ein Strich. Zumindest laut http://unixhelp.ed.ac.uk/CGI/man-cgi?find , FreeBSD (das zeigt -maxdepth n) und einem älteren Ubuntu ( -maxdepth levels). Nun richtig in der Post. Danke fürs bemerken.
Hennes
Ich fügte subdirs hinzu und versuchte es mit maxdepth als erstem Argument, als letztem Argument und damit irgendwo in der Mitte. Alle Ergebnisse waren gleich, daher spielt die Reihenfolge keine Rolle. Zumindest nicht auf meinem Testsystem.
Hennes
2

Vorausgesetzt, Sie haben Bash-Version 4+ (Sie können mit überprüfen bash --version)

shopt -s extglob  ##  turn on extended globbing
rm -- !(*.???)

Für die Rekursivität:

shopt -s extglob globstar
rm -- **/!(*.???)

Im Allgemeinen würde ich empfehlen, diese Zeile in Ihre .bashrc-Datei einzufügen, da erweitertes Globbing und Globstar wirklich nützlich sind:

shopt -s extglob globstar
Übelsuppe
quelle
1

Du könntest es mit versuchen find.

Zeigen Sie diese zuerst an, um sicherzustellen, dass Sie die richtigen Dateien erhalten:

find . -type f ! -name "*.???"

Wenn Sie sicher sind, dass Sie sie löschen möchten, können Sie Folgendes verwenden:

find . -type f ! -name "*.???" -print0 | xargs -0 rm -rfv

oder wenn Sie den -execWeg bevorzugen :

find . -type f ! -name "*.???" -exec rm -rfv {} +

Hinweis: Das {} +funktioniert nur ab einer bestimmten Version (siehe Handbuch man findunter -execPunkt 2). Andernfalls könnten Sie verwenden, -exec -rfv {} \;aber das verursacht einen hohen Aufwand, der rmfür jede Datei ausgeführt wird.

Verwenden Sie dies im richtigen Ordner. Ansonsten durch .den Ordnernamen ersetzen .

Rik
quelle
Oh, während ich mich im Nitpick-Modus befinde: Der dritte Befehl führt einen rm-Befehl für jede Datei aus. Gemeinkosten ++. Sie können dies mit minimieren {} +(siehe den zweiten Absatz über -exec in man find).
Hennes
@Hennes Danke für den Haken am -print0. Ich wusste über den Aufwand von Bescheid -exec. Deshalb bevorzuge ich xargs. Wusste aber nichts davon {} +. Änderte es in meiner Antwort. Vielen Dank.
Rik
Ich habe den Teil {} + selbst erst vor einigen Monaten gelesen. Da ich zwei Absätze hatte, in denen die Option exec beschrieben wurde, las ich nur den ersten. Im Moment ist es allerdings ziemlich frisch in meinem Kopf. :)
Hennes
@ Hennes Und in meinem Fedora 3-Setup (ich weiß ... ALT) funktioniert es nicht. Auf meinem Centos funktioniert es. Es kann also nur {} +ab einer bestimmten Version verwendet werden. Überprüfen Sie immer das Handbuch;)
Rik