Was ist falsch an diesem Befehl „Suche alle Vim-Auslagerungsdateien und entferne sie mit einer Bestätigung“?

Was ist falsch an diesem Befehl „Suche alle Vim-Auslagerungsdateien und entferne sie mit einer Bestätigung“?

Ich versuche, alle Vim-Auslagerungsdateien zu entfernen *.swpund sie mit einer Bestätigung zu entfernen. Der findBefehl hat die Dateien gefunden, rmsagt aber No such file or directorymit der -iOption. Wenn ich den Pfad der Datei fest codiere und einfach verwende, rm -ischeint es zu funktionieren.

Siehe unten

(doors)hobbes3@hobbes3 ~/Sites $ find mysite mysite_BAK -name *.swp -exec 'rm -i {}' \;
find: rm -i mysite/templates/.base.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.create.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.detail.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.list.html.swp: No such file or directory
(doors)hobbes3@hobbes3 ~/Sites $ rm -i mysite/templates/.base.html.swp 
remove mysite/templates/.base.html.swp? n

Ich glaube, ich mache mit der -execOption etwas falsch. Irgendwelche Vorschläge? Vielen Dank im Voraus!

Antwort1

Der Fehler wird erzeugt durchfinden, nichtrm.

Der Grund ist, dass Sie es so geschrieben haben, dass es 'rm -i <file>'das einzige Argument ist. Dies soll umgeschrieben werden:

find mysite mysite_BAK -name '*.swp' -exec rm -i '{}' \;

Daher erhält find mehrere Argumente nach „-exec“ und behandelt das erste als Befehl und die anderen als Befehlsargumente.

Antwort2

AKTUALISIERTE ANTWORT:

Wenn Sie Bash-Versionen >4.0 verwenden, können Sie die Globstar-Funktion nutzen. Das ist ganz einfach:

shopt -s globstar
rm -i **/*.swp

Dies funktioniert auch mit Dateinamen, die Leerzeichen enthalten!

Der shopt -s globstarTeil aktiviert die rekursive **Übereinstimmung in Bash. Sie können dies in Ihr Programm einfügen .bashrcund für immer und ewig glücklich sein.

ALTE ANTWORT:

Normalerweise finde ich es einfacher, einfache Werkzeuge in Kombination zu verwenden

cd ins Verzeichnis und dann:

rm -i `find . | grep .swp$`

es ist einfacher zu merken (wenn die Leistung kein Problem ist)!

Warnung: Verwenden Sie dies nur, wenn Ihre Dateinamen keine Leerzeichen enthalten.

Antwort3

In deinem Fall würde ich laufen,

find mysite mysite_BAK -type f -name .\*.sw? -exec rm -i {} ";"

Die Auslagerungsdatei von VIM endet nicht nur mit .swp. Wenn .swp existiert, erstellt VIM .swo, dann .swn und so weiter. Außerdem werden Auslagerungsdateien mit einem Punkt (.) vorangestellt, z. B. .file1.rb.swp

Andere Möglichkeiten zum Suchen und Löschen der Auslagerungsdateien von VIM ohne Bestätigung (-i):

find some_dir -type f -name .\*.sw? | xargs rm 
find some_dir -type f -name .\*.sw? -exec rm {} ";"
find some_dir -type f -name .\*.sw? -delete  # -delete option does not work in Git Bash

Ohne „-type f“ würden Sie beim Löschen eines Verzeichnisses eine Fehlermeldung erhalten. Außerdem macht \es .\*.sw?in plattformübergreifend kompatibel.

verwandte Informationen