Shell脚本删除文件(如果已存在)


183

我正在做一些将数据存储在文件中的工作。但是,每次我运行脚本时,它都会附加到上一个文件中。

我需要有关如何删除该文件(如果已存在)的帮助。


3
检查文件是否存在 ...,然后调用rm $my_file,对吗?您正在使用什么外壳?
克里斯·斯普拉格

Answers:


182

不要打扰检查文件是否存在,只需尝试将其删除。

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

请注意,如果文件不存在,则第二个命令将失败(返回非零退出状态),但由于-f(简称--force)选项,第一个命令将成功执行。根据情况,这可能是一个重要的细节。

但是更有可能的是,如果要追加到文件,那是因为脚本>>用于将某些内容重定向到文件中。只需替换>>>。由于您未提供任何代码,因此很难说。

请注意,您可以执行类似的操作test -f /p/a/t/h && rm /p/a/t/h,但这完全没有意义。测试很有可能会返回true,但是/ p / a / t / h在尝试将其删除之前将不存在,或者更糟的是,测试将失败并创建/ p / a / t / h在执行下一个预期不存在的命令之前。尝试这是经典的比赛条件。不要这样


5
如果他们需要知道它是否存在并被删除,这将无济于事。吃stderr不能提供这一点。不处理存在并不能让您运行更广泛的脚本而不会失败。
uchuugaka

@uchuugaka当您不在乎文件是否存在时,这是一个简单的解决方案,您要做的就是确保它存在。
卢卡斯·里西斯

关于副作用的正确答案应该是即将到来的和完整的,是我的信息的概括,但是shell脚本经常确实想知道发现或未发现什么以及未采取什么措施。
uchuugaka

rm /p/a/t/h 2> /dev/nullecho $?如果文件不存在,则不会将返回码()保留为0。仅仅因为我们试图删除不存在的文件,这会使詹金斯的工作失败。
ViFI

@uchuugaka-我已经避免了很长一段时间对这个评论的回复,但是需要解决。在删除文件之前检查文件是否存在总是一个坏主意。请参阅我的答案的最后一段。做这种事情是无法避免的固有种族条件。如果您不想覆盖现有文件,则可以尝试一些特定noclobber于Shell的魔术(例如在bash中),或者对现有文件进行chmod-ing,以便在文件存在时重定向失败(无法避免竞争条件),但是所有要做的就是使错误变得更加微妙。
威廉·珀塞尔

126

我使用的另一行命令是:

[ -e file ] && rm file

11
或替代:[!-e文件] || rm文件。此版本返回0而不是某些错误。
nawfel bgh

@nawfelbgh谢谢,这对于链接较长的脚本非常有用。
安倍


65

如果要忽略检查文件是否存在的步骤,则可以使用一个相当简单的命令,该命令将删除该文件(如果存在),并且在不存在的情况下不会引发错误。

 rm -f xyz.csv

1
这只是2015
forgivenson

15
主要的答案并没有说明-f它不会引发错误。这个答案对我有帮助,谢谢。
道格

同意Doug,尽管这对于Wiki式的响应编辑来说似乎是一个很好的用例。
菲利普(Philip)

16

一个衬里外壳脚本,用于删除文件(如果已存在)(基于Jindra Helcl的回答):

[ -f file ] && rm file

或带有变量:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

这样的事情会起作用

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-f检查它是否是常规文件

-e检查文件是否存在

有关更多信息的简介

编辑: -e与-f一起使用是多余的,仅使用-f的fo也应该工作


-a已弃用,请-e改用。
mziccard

我的坏,固定的。感谢@mziccard
P1kachu 2015年

这将在目录或链接或其他非常规文件上引发错误。使用它更好/更安全-f
Jindra Helcl

1
好。尽管如此,-e-fe是多余的,因为-f还检查该文件是否存在,据我知道..
Jindra Helcl

如果我进行编辑,我只会从您的答案中复制出来,但我会
加以修正

4

if [ $( ls <file> ) ]; then rm <file>; fi

另外,如果您使用重定向输出,>而不是>>它将覆盖先前的文件


3
这不是单线的,很抱歉,但是@liwp_Stephen就是这样。
fiorentinoing

即使引用正确,如果出现file类似情况5 -lt 2
也会
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.