这个“查找所有 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

该错误是由寻找, 不是R M

原因是你已经写了它,所以'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

这也适用于包含空格的文件名!

该部分将激活bash 中的shopt -s globstar递归匹配。**你可以把它放在你的身上.bashrc,永远幸福。

旧答案:

我通常发现组合使用简单的工具会更容易

cd 到 dir 然后:

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

其他无需确认(-i)即可查找并删除 VIM 交换文件的方法:

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?还使其兼容多个平台。

相关内容