删除.git .repo .gitignore 总结

来源:互联网 发布:java输入字符串语句 编辑:程序博客网 时间:2024/05/02 02:26

今天写了一个脚本,要删除代码树中所有的.git目录 .repo目录 和所有.gitignore文件

思路:由于有文件夹嵌套情况 不适合用ls 故用find命令查找 并删除

脚本虽短,但还是遇到了许多问题:

filepath=$1;

find filepath:=./name".git"oname".repo"oname".gitignore"print0|whilereadrd’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"oname".repo"oname".gitignore"|whilereadrd’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 ;

0 0
原创粉丝点击