在bash中截断目录

Per*_*-lk 0 directory bash truncate

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

以下命令

$ rm -r $dir/*   
Run Code Online (Sandbox Code Playgroud)

如果目录为空,则不起作用,因为在这种情况下,wilcard *未展开,并且您收到错误消息,指出rm无法找到文件*.

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

有没有另一种方法不检查文件夹内容而只是"截断"目录?

Ray*_*Ray 5

巴什

只是,

$ rm -rf dir/*
Run Code Online (Sandbox Code Playgroud)

(默认情况下我相信)Bash并没有抱怨没有找到任何关于glob的东西.它只是将你的文字glob传递给你的命令:

$ echo dir/*
dir/*
Run Code Online (Sandbox Code Playgroud)

rm找不到具有文字glob字符的文件名时,它会抱怨找不到要求删除的文件:

$ rm "dir/*"
rm: cannot remove ‘dir/*’: No such file or directory
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

但如果你强迫它,它不会抱怨:

$ rm -f "dir/*"
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

我不知道这种抱怨是否是POSIX.

但请注意,如果您没有设置shell选项"dotglob",那么您将错过以点,AKA"隐藏"文件开头的文件.

通常

默认情况下,Zsh不传递文字glob.你必须用" set -o nonomatch" 来要求它.

$ echo dir/*
zsh: no matches found: dir/*
$ echo $?
1
$ set -o nonomatch
$ echo dir/*
dir/*
Run Code Online (Sandbox Code Playgroud)

为了兼容性,我不会使用上面的现代Bash特定的" rm -rf dir/*",但会使用更通用,广泛兼容的解决方案:

$ find dir -mindepth 1 -delete
Run Code Online (Sandbox Code Playgroud)

查找"dir"中最小深度为1的所有文件("dir"本身位于深度0),然后删除它们.