Что не так с командой «найти все файлы подкачки vim и удалить их с подтверждением»?

Что не так с командой «найти все файлы подкачки vim и удалить их с подтверждением»?

Я пытаюсь удалить все файлы подкачки vim *.swpи удалить их с подтверждением. findКоманда нашла файлы, но rmговорит No such file or directoryс -iопцией. Когда я жестко кодирую путь к файлу и просто использую, rm -iто это, кажется, работает.

См. ниже

(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

Думаю, я что-то не так делаю с -execопцией. Есть предложения? Спасибо заранее!

решение1

Ошибка возникает из-занаходить, нетрм.

Причина в том, что вы написали это так, 'rm -i <file>'это единственный аргумент. Это следует переписать:

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

поэтому find получает несколько аргументов после "-exec" и обрабатывает первый из них как команду, а остальные - как аргументы команды.

решение2

ОБНОВЛЕННЫЙ ОТВЕТ:

Если вы используете bash версии >4.0, вы можете воспользоваться функцией globstar, это очень просто:

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

Это также работает с именами файлов, содержащими пробелы!

Часть shopt -s globstarактивирует рекурсивное **сопоставление в bash. Вы можете вставить это в свой .bashrcи быть счастливыми вечно.

СТАРЫЙ ОТВЕТ:

Мне обычно проще использовать простые инструменты в сочетании

Перейдите в каталог и затем:

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

его легче запомнить (если производительность не имеет значения)!

Предупреждение: используйте этот метод только в том случае, если имена ваших файлов не содержат пробелов.

решение3

На вашем месте я бы побежал,

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

Файл подкачки VIM заканчивается не только на .swp. Если .swp существует, VIM создаст .swo, затем .swn и т. д. Кроме того, файлы подкачки имеют префикс в виде точки (.), например, .file1.rb.swp

Другие способы найти и удалить файлы подкачки VIM без подтверждения (-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

Без "-type f" вы получите ошибку при удалении каталога. Кроме того, \in .\*.sw?делает его совместимым на нескольких платформах.

Связанный контент