在bash中截断目录

时间:2014-10-20 17:44:15

标签: bash directory truncate

是否有一些优雅/简单的方法来删除文件夹的内容,如果它是空的,没有错误输出?

以下命令

$ rm -r $dir/*   
如果目录为空,则

不起作用,因为在这种情况下,wilcard *未展开,并且您收到错误消息,指出rm找不到文件*

当然,标准方法是检查它是否为空(使用ls $dir | wc -wfind $dir -link 2或任何其他相关命令),否则删除其内容。

是否有其他方法不检查文件夹内容而只是“截断”目录?

3 个答案:

答案 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