是否有一些优雅/简单的方法来删除文件夹的内容,如果它是空的,没有错误输出?
以下命令
$ rm -r $dir/*
如果目录为空,则不起作用,因为在这种情况下,wilcard *
未展开,并且您收到错误消息,指出rm
找不到文件*
。
当然,标准方法是检查它是否为空(使用ls $dir | wc -w
或find $dir -link 2
或任何其他相关命令),否则删除其内容。
是否有其他方法不检查文件夹内容而只是“截断”目录?
答案 0 :(得分:5)
简单地说,
$ rm -rf dir/*
(默认情况下,我相信)Bash并没有抱怨没有找到任何关于glob的东西。它只是将你的文字全局传递给你的命令:
$ echo dir/*
dir/*
当rm
找不到具有文字全局字符的文件名时,它会抱怨找不到要求删除的文件:
$ rm "dir/*"
rm: cannot remove ‘dir/*’: No such file or directory
$ echo $?
1
但如果你强迫它,它就不会抱怨:
$ rm -f "dir/*"
$ echo $?
0
我不知道这种抱怨是否是POSIX。
但请注意,如果您没有设置shell选项“dotglob”,那么您将错过以点,AKA“隐藏”文件开头的文件。
默认情况下,Zsh不传递文字glob。你必须用“set -o nonomatch
”来要求它。
$ echo dir/*
zsh: no matches found: dir/*
$ echo $?
1
$ set -o nonomatch
$ echo dir/*
dir/*
为了兼容性,我不会使用上面的现代Bash特定的“rm -rf dir/*
”,但会使用更通用,广泛兼容的解决方案:
$ find dir -mindepth 1 -delete
查找“dir”中最小深度为1的所有文件(“dir”本身位于深度0处),并删除它们。
答案 1 :(得分:3)
您可以使用rm -rf
:
rm -rf "$dir"/*
根据man bash
:
-f, --force
ignore nonexistent files and arguments, never prompt
答案 2 :(得分:0)
rm -rf dir/*
不删除名称以点开头的隐藏文件。
这很奇怪,当 bash glob 中的 * 时,它不包含 .* 文件。
mkdir -p dir
touch dir/.a
rm -fr dir/*
ls dir/.a && echo I am not deleted
输出是
dir/.a
I am not deleted
另外,rm -fr dir/*
还有一个缺点:当目录中的文件过多时,rm
命令会得到过多的参数,导致错误too many arguments
。此外,在这种情况下它非常慢。
似乎最可靠和最快的方法是
find dir -mindepth 1 -delete