我正在尝试编写一个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我的方法中的错误是什么。据我所知,空白名称应该会产生一些问题。但是这个剧本未能走得那么远。
答案 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/*/