shell脚本,用于删除已存在的文件

Nik*_*iks 154 shell

我正在研究一些我将数据存储在文件中的东西.但每次我运行脚本时,它都会附加到上一个文件中.

我想要有关如何删除文件的帮助,如果它已经存在.

Wil*_*ell 143

不要费心检查文件是否存在,只是尝试删除它.

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

但更有可能的是,如果要附加到文件,那是因为您的脚本-f用于将某些内容重定向到文件中.只需更换--force>>.很难说因为你没有提供代码.

  • @uchuugaka当您不关心文件是否存在时,这是一个简单的解决方案,您想要的只是确保它*不*存在。 (11认同)
  • @uchuugaka你可以执行`rm -fv`,如果文件被删除,它会输出一条消息,如果没有删除任何内容,它不会输出任何内容。 (6认同)
  • 如果他们需要知道它是否存在并被删除,这没有用.吃stderr并没有提供.不处理存在不会让你有一个更广泛的脚本运行而不会失败. (4认同)
  • 良好的答案应该是即将到来的,并且关于副作用的完整是我的消息的概括,但是 shell 脚本经常确实想知道什么是或没有找到,以及什么是或没有执行。 (3认同)
  • @uchuugaka——我已经有一段时间避免回应这个评论了,但它需要得到解决。在删除文件之前检查文件是否存在*总是*一个坏主意。请参阅我的答案的最后一段。有一种固有的竞争条件,无法通过做这类事情来避免。如果您不想覆盖现有文件,您可以尝试一些特定于 shell 的魔法(例如 bash 中的“noclobber”),或者可能 chmod 现有文件,以便在文件存在时重定向失败(不会避免竞争)条件),但所做的只是让错误变得更加微妙。 (3认同)

小智 106

我使用的另一个命令是:

[ -e file ] && rm file
Run Code Online (Sandbox Code Playgroud)

  • 或者:-e文件] || rm文件。此版本返回0而不是某些错误。 (5认同)
  • 对于那些不太细心的人,比如我,左括号和感叹号之间有一个空格,这是命令正常工作所必需的 (2认同)

Jin*_*lcl 73

你可以用这个:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi
Run Code Online (Sandbox Code Playgroud)

  • 这应该是选定的答案. (4认同)
  • 你不应该引用`“$file”`吗? (3认同)
  • @JindraHelcl,所以你提供了一个本质上错误的答案。:( (2认同)

gre*_*ror 54

如果您想忽略检查文件是否存在的步骤,那么您可以使用一个相当简单的命令,如果存在该文件将删除该文件,如果该文件不存在则不会抛出错误.

 rm -f xyz.csv
Run Code Online (Sandbox Code Playgroud)

  • 主要答案没有解释用`-f`它不会抛出错误.这个答案对我有所帮助,谢谢. (11认同)

P1k*_*chu 13

像这样的东西会起作用

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 
Run Code Online (Sandbox Code Playgroud)

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

-e检查文件是否存在

如果有更多信息,请参见介绍

编辑: -e与-f一起使用是多余的,单独使用-f也应该可行


nbe*_*hat 10

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

[ -f file ] && rm file

或带有变量:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file
Run Code Online (Sandbox Code Playgroud)


Sib*_*ain 7

因此,就我而言,我想在再次创建 FIFO 文件之前删除它,所以这对我有用:

#!/bin/bash

file="/tmp/test"
rm -rf $file | true
mkfifo $file
Run Code Online (Sandbox Code Playgroud)

| true即使未找到文件也会继续执行脚本。