在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
问题是ls命令列表链接当前文件夹和父文件夹。所以你必须测试你的i变量是否设置为'。'或 '..'
if [ -d $i ] -a [ $i != '.' ] -a [ $i != '..' ]
then
rm -r $i
fi
.
和..
不应该出现在ls
输出。
但是,你可以用
ls -A
测试(-A的意思是 '几乎所有'
-a意味着 '所有')
和:你为什么不强制使用for i in 'ls'
?
我不清晰理查德解释道。 – 2012-01-13 10:09:11
You shouldn't use ls
此命令。有一个很简单的方法,以确保你只遍历目录:
for dir in */
do
echo "$dir"
done
仅供参考,您也可以在/ tmp/foo/* /中执行dir命令。做...' – Eldelshell 2016-04-11 16:22:50
“*/
”应该匹配所有子目录
尝试是这样的:
rm -rf /path/to/mySubfolder/*/
+1表示ls ./*会列出子目录中的内容。 – 2012-01-13 09:49:57