在bash中删除给定文件夹中的所有目录

在bash中删除给定文件夹中的所有目录

问题描述:

我正在尝试编写一个shell脚本来删除给定目录中的所有子目录。我知道有一个相同的简单方法。 像这样在bash中删除给定文件夹中的所有目录

find ./ -type d -exec rm -r {} \;
但自从我学习shell脚本,所以我更喜欢写相同的脚本。这里是我的方法

for i in `ls ./*`; do 
if [ -d $i ];then 
rm -r $i 
fi 
done 

当我运行此脚本,这给了我下面的错误

RM:不能删除目录:`“。

给这个错误this stops.So什么是我的方法中的错误。据我了解,空白名称应该产生一些问题。但是这个剧本并没有走得那么远。

ls ./*列出了每个直接子目录中的所有文件。 -d然后检查文件的名称,但好像它在。而不是它来自的子目录。

例如,如果您有:

foo1/ 
    bar 
foo2/ 
    baz 

那么LS ./*会使得酒吧和巴兹的名单,因为./*将匹配foo1和foo2的,然后将LS列出每个内容这两个目录。

您得到的错误信息可能是因为您的ls已被别名为'ls -a'列出。和..弗洛林的答案说,你可以用ls -A ./*来避免这个问题。 。

如果你只是想删除的目录中,只是做:

for i in `ls -A`; do if [ -d $i ]; then rm -r $i; fi; done 
+0

+1表示ls ./*会列出子目录中的内容。 – 2012-01-13 09:49:57

问题是ls命令列表链接当前文件夹和父文件夹。所以你必须测试你的i变量是否设置为'。'或 '..'

if [ -d $i ] -a [ $i != '.' ] -a [ $i != '..' ] 
then 
rm -r $i 
fi 

...不应该出现在ls输出。

但是,你可以用

ls -A 

测试(-A的意思是 '几乎所有'

-a意味着 '所有')

和:你为什么不强制使用for i in 'ls'

+0

我不清晰理查德解释道。 – 2012-01-13 10:09:11

You shouldn't use ls此命令。有一个很简单的方法,以确保你只遍历目录:

for dir in */ 
do 
    echo "$dir" 
done 
+0

仅供参考,您也可以在/ tmp/foo/* /中执行dir命令。做...' – Eldelshell 2016-04-11 16:22:50

*/”应该匹配所有子目录

尝试是这样的:

rm -rf /path/to/mySubfolder/*/