Befehl zum Löschen von temporären Dateien, die mit ~ enden

15

Vor vielen Tagen habe ich diesen nützlichen Bash-Alias ​​gefunden (Inhalt meiner ~ / .bash_aliases )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

Jetzt habe ich versucht, rm~danach cdein Verzeichnis zu verwenden, das 3 Dateien enthält, die auf enden~

Ich habe diesen Fehler im Terminal erhalten und die Dateien wurden nicht gelöscht

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Auch wenn ich versuchte , rm~aus /home/me, so scheint es zu sein , nichts zu tun. Oder es könnte viel Zeit in Anspruch nehmen.

Bitte sagen Sie mir, warum ich einen Fehler erhalte und wie ich ihn beheben kann.

Vielen Dank!

Vinayak Garg
quelle

Antworten:

26

Ihr Bash-Alias ​​ist nicht gut geschrieben (die einfachen Anführungszeichen werden nicht gut verwendet). Stattdessen sollte es sein:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

Nun, ich persönlich mag keine nutzlosen Verwendungen von Pfeifen und xargsdeshalb wäre Ihr Alias ​​besser geschrieben als:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

Die -type fOption, um nur Dateien zu finden (keine Verzeichnisse, Links usw.), die -vOption rm, um ausführlich zu sein (druckt aus, was gelöscht wird). Das läuft also +am Ende mit allen gefundenen Dateien (erzeugt nur eine Instanz von , anstatt eine pro Datei).findrmrm

Jetzt von man bash:

Für fast jeden Zweck werden Aliase durch Shell-Funktionen ersetzt.

Anstelle eines Alias ​​ist es besser, eine Funktion zu verwenden: Kommentieren Sie Ihren Alias ​​in der .bash_aliasesDatei (dh setzen Sie ein #vor diese Zeile), und .bashrcsetzen Sie diese Funktion in die Datei (irgendwo in der Datei, am Ende ist alles in Ordnung). :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

Wie in der anderen Antwort erwähnt, können Sie den -deleteBefehl zum Suchen verwenden. In diesem Fall ist Ihre rm~Funktion:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

Tatsächlich können Sie eine coole Funktion erstellen, die ein Argument übernimmt --dry-run, das beispielsweise nur das ausgibt, was sie löscht:

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

Dann verwenden Sie als:

rm~ --dry-run

um nur die zu löschenden Dateien anzuzeigen (aber nicht zu löschen) und dann

rm~

wenn du damit zufrieden bist.

Passen Sie sich Ihren Bedürfnissen an und erweitern Sie sie!

Hinweis. Sie müssen ein neues Terminal öffnen, damit die Änderungen wirksam werden.

gniourf_gniourf
quelle
Vielen Dank! Es funktioniert gut und Trockenlauf ist sehr hilfreich.
Vinayak Garg
2
find -type f -name '*~' -delete(Waffe der Wahl, außerdem git clean -dfx .)
sehe
2
Das ist so eine elegante Lösung, ich musste mich einloggen, nur um dir Requisiten zu geben. +1 an dich, mein guter Kerl!
CodeChimp
9

*~wird durch die Shell erweitert, bevor sie Ihrem Alias ​​zugewiesen wird. Die eigentliche Aufgabe ist:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

Ich schlage vor, Funktionen anstelle von Aliasen zu verwenden. Diese sind viel leistungsfähiger und in Bezug auf Anführungszeichen einfacher zu handhaben.

Entfernen Sie das überflüssige .Verzeichnis (das aktuelle Verzeichnis wird impliziert, wenn keine Parameter angegeben sind), und beenden Sie den Missbrauch, xargsda bereits eine -deleteOption vorhanden ist.

rm~() { find -name '*~' -ls -delete; }

Die -lsOption ist optional, das Hinzufügen zeigt jedoch an, welche Dateien gelöscht wurden.

Lekensteyn
quelle
+1 Danke! Aber wo füge ich diese Funktion hinzu?
Vinayak Garg
@ VinayakGarg Du kannst es auch zu deinem hinzufügen .bash_aliases, aber ich lege sie normalerweise direkt in mein .bashrc.
Lekensteyn