这个“查找所有 vim 交换文件并通过确认删除它们”命令有什么问题?

hob*_*es3 3 find rm

我正在尝试删除所有 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
Run Code Online (Sandbox Code Playgroud)

我想我在这个-exec选项上做错了什么。有什么建议?提前致谢!

Net*_*tch 8

错误是由find生成的,而不是rm

原因是你已经写了它,所以'rm -i <file>'是单个参数。这将被重写:

find mysite mysite_BAK -name '*.swp' -exec rm -i '{}' \;
Run Code Online (Sandbox Code Playgroud)

所以 find 在“-exec”之后得到多个参数,并将第一个作为命令,其他作为命令参数。

  • 您也可以省略 `{}` 周围的引号 (5认同)
  • 使用 `"*.swp" ` 而不仅仅是 `*.swp` 的好习惯;后者在 zsh 中不起作用,因为 shell 对通配符的处理方式不同。 (2认同)

pol*_*zul 8

更新的答案:

如果您使用 bash 版本 >4.0,您可以使用 globstar 功能,这非常简单:

shopt -s globstar
rm -i **/*.swp
Run Code Online (Sandbox Code Playgroud)

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

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

旧答案:

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

cd 到目录,然后:

rm -i `find . | grep .swp$`
Run Code Online (Sandbox Code Playgroud)

它更容易记住(如果性能不是问题)!

警告:仅当您的文件名不包含空格时才使用此选项。