Wie benutze ich find, um * .py ~ und * .pyc Dateien gleichzeitig zu entfernen?


7

Ich möchte ein Verzeichnis (und Unterverzeichnisse) von jedem Vorkommen der .pyund .pyc-Dateien bereinigen . Ich habe folgendes versucht

find . -name '*pyc' -o -name '*py~' -exec rm -f {} \;

das ließ alle pycDateien aus. Wenn Sie das tun

find . -name '*pyc' -o -name '*py~'

Der Befehl findet die pycDateien, die überhaupt nicht gelöscht werden. Irgendwelche Einsichten?

Antworten:


10

Anstatt das -oWarum nicht einfach ein Platzhaltermuster zu verwenden?

find . -name '*py[c~]' -delete

oder:

find . -name '*py[c~]' -exec rm -f {} +

2
Guter Punkt für diesen speziellen Fall. Beachten Sie, dass es sich nicht um einen regulären Ausdruck handelt, sondern immer noch um ein Shell-Platzhaltermuster.
— Stéphane Chazelas

Ahh, ich habe sie immer als gleich verstanden. Danke, dass du das korrigiert hast.
— h3rrmiller

10

Der -aOperator (implizit zwischen zwei Prädikaten) hat Vorrang vor -o, daher benötigen Sie Klammern:

find . \( -name '*pyc' -o -name '*py~' \) -a -exec rm -f {} +

(Ich füge das -aObige nur zu Demonstrationszwecken hinzu, es wird nicht benötigt, da es implizit ist). Ich ersetzte ;mit +so gibt es wahrscheinlich keinen Sinn , läuft man rmpro Datei , wenn diese vermieden werden können.


1
Warum benutzt du nicht einfach -delete?
— Aif

6
@Aif, da dies -deletekeine Standardoption ist. Verwenden Sie findes auf jeden Fall, wenn Sie es unterstützen, aber verwenden Sie es nicht in Skripten, die portabel sein sollen.
— Stéphane Chazelas

findist Perl sehr ähnlich. Erstaunlich mächtig, aber nur zum Schreiben.
— Plutor

@StephaneChazelas Oh, ich wusste es nicht! Ich habe es unter OSX sowohl auf find als auch auf gnu-find, also denke ich, "wenn selbst BSD find es hat, muss es portabel sein!".
— Aif

0

Wenn Sie Bash 4+ haben, müssen Sie nicht einmal finden, da Globstar Ihnen rekursives Globbing ermöglicht:

shopt -s globstar
for f in ./**/*.py{c,~}; do rm "$f"; done

Beachten Sie, dass shoptdies in einer eigenen Zeile stehen muss und nicht durch ein getrennt werden muss ;(und ganz oben in einem Skript verwendet werden sollte, wenn möglich direkt unter dem Shebang).


0

Ich weiß, dass die Frage nicht so neu ist ... aber vielleicht hat sie gereicht

rm -f `find . -name '*.pyc' -o -name '*.py~' `
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.