如何修复将ads/中含指定字符串文件复制到projection/的脚本错误?
修复cp命令非法选项错误的解决方案
咱们先拆解下你脚本里的问题根源:
- 首先awk的分隔符用了
//,但实际文件路径都是单斜杠/分隔的,这会导致你提取的路径完全混乱; - 更关键的是xargs后面的命令写法错了——
cp $0 projection/$1里的$0指的是你当前运行的脚本本身,$1也不是xargs传递过来的文件名,这直接让cp接收到了错误参数,触发了非法选项的报错; - 另外你提到要移动文件,但脚本里用的是
cp(复制),如果确实要移动得换成mv哦。
给你几个靠谱的修复方案:
方案1:直接批量复制到目标目录(最简单)
如果不需要额外处理路径,直接用cp -t指定目标目录,完美适配xargs的批量传递逻辑:
grep -Rli '22/05/2018' ads/ | xargs cp -t projection/
方案2:用xargs占位符处理(更灵活)
如果需要对文件名做额外调整,用xargs -I {}指定占位符,把每个匹配的文件路径代入命令:
# 复制文件 grep -Rli '22/05/2018' ads/ | xargs -I {} cp {} projection/ # 如果是移动文件,替换成mv grep -Rli '22/05/2018' ads/ | xargs -I {} mv {} projection/
方案3:处理含空格/特殊字符的文件名
如果你的文件名里有空格或者特殊字符,得用零字节分隔符避免出错:
grep -RliZ '22/05/2018' ads/ | xargs -0 cp -t projection/
简单解释下各部分的作用:
grep -Rli '22/05/2018' ads/:递归扫描ads目录,找出包含22/05/2018的文件,-l只输出文件名,-i是忽略大小写(不需要的话可以删掉);xargs -0/xargs -I {}:负责把grep输出的每个文件名传递给后面的cp/mv命令,确保每个文件都被正确识别;cp -t projection/:-t选项让cp先接收目标目录,再接收源文件,这样批量传递多个源文件时不会出现参数顺序错误。
内容的提问来源于stack exchange,提问作者sensorario
相关产品推荐
相关产品推荐

