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

时间:2012-01-13 09:17:18

标签: bash shell

我正在尝试编写一个shell脚本来删除给定目录中的所有子目录。我知道有一个简单的方法。 喜欢这样做

find ./ -type d -exec rm -r {} \;
但是因为我正在学习shell脚本,所以我更愿意为它编写一个脚本。这是我的方法

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

当我运行此脚本时,这会给我以下错误

  

rm:无法删除目录:`。'

在给出这个错误之后

这个stops.So我的方法中的错误是什么。据我所知,空白名称应该会产生一些问题。但是这个剧本未能走得那么远。

5 个答案:

答案 0 :(得分:7)

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

例如,如果你有:

foo1/
  bar
foo2/
  baz

然后ls ./*将列出bar和baz,因为./*将匹配foo1和foo2,然后ls将列出这两个目录中每个目录的内容。

您收到的错误消息可能是因为您的ls已被别名为列出的'ls -a'。并且......正如Florin所说,你可以使用ls -A ./*来避免这个问题。

如果您只想删除。中的目录,请执行以下操作:

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

答案 1 :(得分:3)

...不应出现在ls的输出中。

但是,您可以使用

进行测试
ls -A 

( - A表示'几乎所有'

-a表示'全部')

并且:你为什么不使用for i in 'ls'

答案 2 :(得分:3)

此命令中

You shouldn't use ls。有一种非常简单的方法可以确保只迭代目录:

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

答案 3 :(得分:0)

问题是ls命令列出了当前文件夹和父文件夹的链接。因此,您必须测试您的i变量是否设置为'。'或'..'

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

答案 4 :(得分:0)

*/”应匹配所有子目录

尝试这样的事情:

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