今天写了一个脚本,要删除代码树中所有的.git目录 .repo目录 和所有.gitignore文件
思路:由于有文件夹嵌套情况 不适合用ls 故用find命令查找 并删除
脚本虽短,但还是遇到了许多问题:
filepath=$1;
find filepath:=./−name".git"−o−name".repo"−o−name".gitignore"−print0|whileread−r−d ’0’ fileName
do
echo "$fileName";
rm -rf "$fileName" ;
done
这是第一版代码 问题是所有内容都没有输出.
原因:1\ find 命令的print0 选项输出文件的全路径且以’\0’结尾 但是只能输出普通文件,不能输出目录文件的路径 所以.git和.repo路径不能输出
2\read -d $'\0'表示读取直到'\0'结束读取,由于print0不能输出目录 所以开始while没有读取到文件条件不为真 所有直接结束循环 结束脚本程序
filepath=$1;
find filepath:=./−name".git"−o−name".repo"−o−name".gitignore"|whileread−r−d ’0’ fileName
do
echo "$fileName";
rm -rf "$fileName" ;
done
这是第二版代码: 依然没有输出
原因:1\ find 命令不加print输出为’\n’结尾 while 依然读取不到以’\0’结尾字符串 所以条件为假 跳出循环 结束脚本
最终脚本:
find ${filepath:=./} -name “.git” -o -name “.repo” -o -name “.gitignore” | while read -r fileName
do
echo "$fileName";
rm -rf “$fileName” ;
done
成功
原因:1\find的每行输出以’\n’结尾 while不需判断以’\0’结尾 所以成功运行循环
总结:
shell脚本中, 管道不是输入端分布输入数据到管道右端的 而是执行完成后将数据一次性输出到管道右边 .
等效为
find ${filepath:=./} -name “.git” -o -name “.repo” -o -name “.gitignore” >> a ;
while read -r -d $’0’ fileName
do
echo "$fileName";
rm -rf "$fileName" ;
done << a ;