处理git grep -l输出中文件名含空格的问题
处理git grep -l输出中文件名含空格的问题
嗨,我来帮你搞定这个文件名带空格的问题~你现在的代码之所以会报错,是因为当你用for file in $(git grep ...)这种写法时,Shell会把git grep的输出按空格、制表符、换行符拆分,把一个带空格的文件名(比如my private file.txt)拆成my、private、file.txt三个独立的变量,传给git rm的时候自然就找不到对应的文件,报pathspec错误了。
给你两种靠谱的修改方案,你可以选适合自己的:
方案一:用while read循环配合null分隔符
这是最常用也最稳妥的写法,能完美处理带空格、换行甚至特殊字符的文件名:
#!/bin/sh # 用--null让git grep用null字符分隔文件名,避免空格拆分 git grep -l -i --null '#private' | while IFS= read -r -d '' file; do git rm "$file" echo "$file is private." done
我给你拆解下关键参数的作用:
--null:让git grep输出的每个文件名之间用null字符分隔,而不是默认的换行(null字符是文件路径里绝对不会出现的字符,所以能准确区分每个文件名)IFS=:告诉read命令不要忽略文件名开头或结尾的空格-r:防止read把文件名里的反斜杠当成转义字符-d '':指定read的分隔符是null字符,和git grep的--null对应
方案二:用xargs -0批量处理(更简洁)
如果想要更简洁的写法,也可以用xargs的-0选项来处理null分隔的输出,要是需要保留echo的逻辑,可以这么写:
#!/bin/sh git grep -l -i --null '#private' | xargs -0 -I {} sh -c 'git rm "{}"; echo "{} is private."'
这里-0和git grep的--null对应,-I {}是把每个文件名替换成{},然后交给sh -c执行后面的命令。
这样修改后,不管文件名里有多少空格,Shell都能准确识别出完整的文件路径,再也不会报pathspec错误啦~
备注:内容来源于stack exchange,提问作者O Pardal
相关产品推荐
相关产品推荐

