delete.bat
delete.csh
功能:
删除某一目录树中的空目录。
格式:
delete(.bat) dirname
sh delete.csh dirname或(设置了chmod +x delete.csh后)./delete.csh dirname
注意:
1.两者都是通过递归调用实现从目录树的最深层向上逐层删除的功能,主要功能语句,是for循环,判断是否为目录,如果是,进入其子目录,当到达目录的最深层,判断其是否为空(通过两个for循环分别判断是否有文件、文件夹),如果为空,删除;然后逐级向上进行相同操作。
2.在递归调用的过程中,不能使用变量(如下例中的d),如delete.bat文件中
for /D %%m in (%1\*) do call %0 %%m
set /A n=0
for %%m in (%1\*) do set /A n=n+1
for /D %%m in (%1\*) do set /A n=n+1
if %n% EQU 0 rmdir %1&&echo delete %1
不能写作
for /D %%m in (%d%\*) do call %0 %%m
set /A n=0
for %%m in (%d%\*) do set /A n=n+1
for /D %%m in (%d%\*) do set /A n=n+1
if %n% EQU 0 rmdir %d%&&echo delete %d%
因为在批处理文件中,没有堆栈,作为变量d,会在下一层递归中被改变数值,造成运行错误,而不会像高级语言(c语言等)那样。
DOS下
@echo off
for /D %%m in (%1\*) do call %0 %%m
set /A n=0
for %%m in (%1\*) do set /A n=n+1
for /D %%m in (%1\*) do set /A n=n+1
if %n% EQU 0 rmdir %1&&echo delete %1
Linux下
for name in $1/*
do
if test -d $name
then
sh delete.csh $name
fi
done
var=0
for x in $1/*
do
if test -d $x
then
var=`expr $var + 1`
fi
if test -f $x
then
var=`expr $var + 1`
fi
done
if [ $var -eq 0 ]
then
rmdir $1
fi