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?

Alex
quelle

Antworten:

10

Anstatt das -oWarum nicht einfach ein Platzhaltermuster zu verwenden?

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

oder:

find . -name '*py[c~]' -exec rm -f {} +
h3rrmiller
quelle
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.

Stéphane Chazelas
quelle
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).

Übelsuppe
quelle
0

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

rm -f `find . -name '*.pyc' -o -name '*.py~' `
Hastur
quelle