为了写个遍历文件的脚本,找了好多网上的参考,终于没问题了,就总结一下。
for fileName in *; do
if [[ -d $fileName ]]; then
echo $fileName;
elif [[ ! -e $fileName ]]; then
echo $fileName not exist
fi
done
开始用这种方法遍历目录下的文件,后来发现*只能找到可见文件,找不到隐藏的文件,而我要处理的文件夹可能会是隐藏文件,
就又在网上找到了一种方法:
files=`ls -A`
for fileName in $files; do
if [[ -d $fileName ]]; then
echo $fileName;
elif [[ ! -e $fileName ]]; then
echo $fileName not exist
fi
done
这种方法可以在/bin/bash 下用 ,/bin/zsh 下 ls -A 返回的不是数组,无法遍历,没找到原因,由于我开始默认用的是zsh,坑了我好大一会找原因,这可能就是两种shell的不同吧
虽然能遍历了,但是发现个别目录进不去,因为文件名有空格,这个通常的毛病网上确实很多相关答案,可是在我的脚本里不能很好工作,不知道是不是解决这个问题的人和我的环境不一样。我是Mac平台/bin/bash, 这个 IFS=$(echo -en "\n\b") 更改IFS的放到我的脚本里反而把我没有空格的文件名都给拆开了,找了半天找到 用 IFS=$'\n' (单引号) 解决了,下面就附上我随便写的递归删除所有目录下的 .svn脚本:
#!/bin/bash
# rm svn file
echo $1
if [[ ! -d $1 ]]; then
echo "not dir"
return
fi
SAVEIFS=$IFS;
IFS=$'\n'
rmDirSvn(){
cd $1;
countF=`ls -A | wc -l`
if [[ $countF -eq 0 ]]; then
cd ./../
echo $1 is null
return;
fi
countF=`find . -name ".svn" -maxdepth 1`
if [[ -n $countF ]]; then
rm -rf .svn
fi
files=`ls -A`
for fileName in $files; do
if [[ -d $fileName ]]; then
rmDirSvn $fileName;
elif [[ ! -e $fileName ]]; then
echo $fileName not exist
fi
done
cd ./../
}
rmDirSvn $1;
IFS=$SAVEIFS
运行的时候只需要 ./rmSvn.sh testSvn 就能删除testSvn目录下的所有.svn目录了
其实上面这么多代码和下面这几行是等价的
IFS=$'\n'
files=`find . -name ".svn"`
for f in $files;do
rm -rf $f
或者一行命令也足已搞定:
find . -name ".svn" -exec rm -rf {} \;
这条命令的好处就是不用设置IFS也能处理空格的文件
以上是我参考了许多网友的经验,再次表示感谢。