2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347

如何使 rm 在文件不存在时不出错?

我正在写一个makefile,可以在编译结束后清理一些无用的文件。如果已经有一个目标,它当然会跳过这个目标,无用的文件可能就不存在了。所以如果我这样做。

rm lexer.ml interpparse.ml interpparse.mli

我可能会收到错误,因为其中一个文件不存在。有什么方法可以告诉rm忽略这些文件吗?

在阅读手册页面时,我看到以下选项。

-f Attempt to remove the files without prompting for confirma-
             tion, 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. The -f option overrides any
             previous -i options.

这听起来差不多是我想要的,但我不太确定权限部分。有什么方法可以做到这一点吗?

答案 (11)

296
296
296
2009-11-27 16:54:52 +0000
$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

&001

-f 这个选项肯定是你要使用的。如果你对目录有写权限,这是允许的,但有点奇怪,这就是为什么rm通常会警告你的原因。

132
132
132
2015-03-09 12:39:25 +0000

另一个解决方案是这样的。https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

只要在你的命令后面加上一个OR语句:

rm -rf my/dir || true

这样,当语句#1失败时(抛出错误),运行语句#2,简单来说就是true

79
79
79
2012-12-23 23:12:06 +0000

我是来晚了,但我经常用这个方法。在一个makefile中,将-添加到行的开头,以忽略该行的返回值。如:

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

如果你不想使用-f选项,可以选择:

rm filethatdoesntexist 2> /dev/null

这只会让错误不被打印出来。

8
8
8
2009-11-27 16:48:43 +0000

如果你找到了一些方法来glob 文件名,那么rm找不到匹配的文件名就不会抱怨。所以,像lexer.m* interpparse.*之类的东西应该是可行的(当然,注意不要删除太多)。另外,-f是一个非常合理的方法,只要你不是希望文件权限能让你免于删除一个你不想删的文件–如果你不想删,就不要把它放在列表里。

6
6
6
2009-11-27 19:27:29 +0000

-f选项意味着如果有不符合预期的情况,不会提示你。

BUT* ,如果你有足够的权限来删除一个文件,它不会被删除。 作为所有者,你可以chmod u+w,然后删除它:rm -f将删除该文件。

5
5
5
2011-03-11 10:36:07 +0000

也许可以帮助一个类似于:

touch fakefile.exe fakefile.o && rm *.o *.exe

我知道这不是很聪明,但它做的工作。

3
3
3
2015-06-11 13:55:15 +0000

以下是我在shell脚本中使用的方法。它隐藏了错误信息和错误代码。

rm doesnotexist 2> /dev/null || echo > /dev/null
3
3
3
2009-11-27 17:44:12 +0000

另一种选择:

RmIfIsFile() { for f in "$@"; do [-f $f] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli

太可惜了,Makefiles不能跨行共享shell函数定义。

1
1
1
2017-02-02 16:11:37 +0000

如果文件不存在的话,你可以在rm之前触摸这些文件,如果不存在的话,就可以创建这些文件:-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
1
1
2017-08-19 09:47:36 +0000

rm -rf ppp>/dev/null 2>&1you newer得到错误信息 问题发生了,如果错误生成的不是STDERR 2而是STDOUT 1….. 这是发生在命令生成的不是错误而是警告时。你需要设置过滤器并删除这个消息。但这种情况很正常。