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.