rm -f的替代选项


10

我想运行一个命令行:

cd ~/www/tmp/; rm -P 2*

但是如果没有以2开头的文件,我会报错。

您可能认为我想使用-f,但是:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

而且我确实在乎文件权限-如果发生奇怪的事情,我希望使用命令中止。我只想抑制“不存在”错误。

我查看了一些其他带有“ rm错误”的问题,发现这两个(有点)相关:

删除文件和目录的名称。无此文件或目录

但是,我不了解该问题答案中的所有内容,也不知道我需要它吗?

touch这个问题的黑客建议:

缺少文件时,rm是否没有报告?

似乎可行,因为我认为我不会介意绩效下降(但是您会选择哪种类型的绩效下降?-即:这是一种可合理扩展的技术,还是我只是在学习非常不好的习惯?)

我不确定如何if-then在命令行中执行操作。

还有简单的命令行剪切粘贴粘贴清理其他选项吗?

find -delete我的情况会更好吗?如果是这样,为什么?


有问题的错误:

rm: 2*: No such file or directory

1
该错误来自您的外壳,而不是您的外壳, rm因此您需要说明那是什么。
Michael Homer

您是否正在zsh用作交互式外壳?您遇到No matches found错误了吗?
库沙兰丹

2
@MichaelHomer不,错误来自rm。Shell只是将字符串传递2*给rm,而不是将其扩展为文件列表。看看有问题的错误:它说rm正在抱怨,而不是sh / bas / zsh / ...
doneal24 '18

Answers:


13

要只调用rm -P现有的常规文件名匹配的目录模式(但不低于):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

例如,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

要仅匹配非目录,请使用! -type d代替-type f。区别在于,! -type d对于更广泛的文件类型(符号链接,命名管道,套接字等)而言,这是正确的。

既然你想被提示上的文件一定条件下发现,你应该使用-delete的,而不是-exec rm因为这作品rm -f

删除-maxdepth 1find递归方式查看子目录。


3
虽然! -type d可能更接近rm 2*,但我认为呢?
大师

因此,我必须添加-P才能获得该功能?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082 '18

@ user3082是的,我忘记了您也想使用-P
库萨兰南达

谢谢@muru,我实际上是想要的-type f,但不知道如何做出这样的rm举动-因此@Kusalanada的建议很明确,差异化/解释非常适合学习。
user3082

@ user3082,您可能必须使用shell的扩展glob(例如,rm 2*(.)在zsh中)。
穆鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.