截断bash中的目录

截断bash中的目录,bash,directory,truncate,Bash,Directory,Truncate,是否有一些优雅/简单的方法来删除文件夹的内容,如果文件夹为空,则不会出现错误输出 下面的命令 $ rm -r $dir/* 如果目录为空,则不起作用,因为在这种情况下,不会展开wilcard*,并且您会收到一个错误,说明rm找不到文件* 当然,标准方法是使用ls$dir | wc-w或find$dir-link 2或任何其他相关命令检查它是否为空,否则删除它的内容 有没有其他方法不检查文件夹内容而只截断目录?您可以使用rm-rf: 根据man bash: 您可以使用rm-rf: 根据ma

是否有一些优雅/简单的方法来删除文件夹的内容,如果文件夹为空,则不会出现错误输出

下面的命令

$ rm -r $dir/*   
如果目录为空,则不起作用,因为在这种情况下,不会展开wilcard*,并且您会收到一个错误,说明rm找不到文件*

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

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

您可以使用rm-rf:

根据man bash:

您可以使用rm-rf:

根据man bash:

猛击 简单地说

$ rm -rf dir/*
默认情况下,我相信Bash不会抱怨glob没有找到任何东西。它只是将文本glob传递给命令:

$ echo dir/*
dir/*
当rm找不到具有文字glob字符的文件名时,它会抱怨找不到要求其删除的文件:

$ rm "dir/*"
rm: cannot remove ‘dir/*’: No such file or directory
$ echo $?
1
但如果你强迫它,它不会抱怨:

$ rm -f "dir/*"
$ echo $?
0
我不知道不抱怨是否是POSIX

但是,请注意,如果没有设置shell选项dotlob,您将丢失以点开头的文件,即隐藏文件

通常地 默认情况下,Zsh不会传递文本glob。你必须用set-o非OMATCH来要求它

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

$ find dir -mindepth 1 -delete
在目录中查找所有文件,最小深度为1。目录本身的深度为0,然后将其删除。

Bash
rm -rf dir/*
简单地说

$ rm -rf dir/*
默认情况下,我相信Bash不会抱怨glob没有找到任何东西。它只是将文本glob传递给命令:

$ echo dir/*
dir/*
当rm找不到具有文字glob字符的文件名时,它会抱怨找不到要求其删除的文件:

$ rm "dir/*"
rm: cannot remove ‘dir/*’: No such file or directory
$ echo $?
1
但如果你强迫它,它不会抱怨:

$ rm -f "dir/*"
$ echo $?
0
我不知道不抱怨是否是POSIX

但是,请注意,如果没有设置shell选项dotlob,您将丢失以点开头的文件,即隐藏文件

通常地 默认情况下,Zsh不会传递文本glob。你必须用set-o非OMATCH来要求它

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

$ find dir -mindepth 1 -delete
在目录中查找所有文件,最小深度为1。目录本身的深度为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/*还有另一个缺点:当dir中的文件太多时,rm命令将获得太多参数,并导致错误的参数太多。而且,在这种情况下速度非常慢

似乎最可靠、最快的方法是

find dir -mindepth 1 -delete
不删除名称以点开头的隐藏文件

这很奇怪,当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/*还有另一个缺点:当dir中的文件太多时,rm命令将获得太多参数,并导致错误的参数太多。而且,在这种情况下速度非常慢

似乎最可靠、最快的方法是

find dir -mindepth 1 -delete

... 我把问题提得太快了。显而易见的解决办法。谢谢我把问题提得太快了。显而易见的解决办法。谢谢