长话短说,我有一个看起来像这样的脚本块:
cd ${1} # via command-line argument
find . -name "output*.txt" | xargs cat ${1} | grep -v ${filter} > temp.txt
我基本上到了这一步,在命令行中构建find ...
行,然后将其粘贴到我的脚本中,然后添加cd
命令,以便在包装器中重用此脚本将在大量目录上运行此脚本。无论如何...
问题是cd
和xargs
使用相同的${1}
变量,哪种变种
我知道我可以从${1}
删除xargs
参数,我可能会重写find
命令根本不需要xargs
,但我的问题仍然存在:
我在${1}
使用cd
之后是否有办法“重置”xargs
,以便{{1}}不会
答案 0 :(得分:2)
我不熟悉使用xargs
作为默认替换字符串的${1}
版本,但以下内容应该有效:
find . -name "output*.txt" | xargs -I '{}' cat '{}' | grep -v ${filter} > temp.txt
答案 1 :(得分:0)
实用程序xargs只是管理参数的数量,并且大括号充当参数或文件名{}的占位符。
我确实模拟了你拥有的包装器,并且因为$ {1}传递给我的函数的路径名被xargs拾取了同样的问题......但这就是shell的工作方式,实际上shell只会替换/展开所有变量和内容以使命令在执行前完成
实用程序arnt编码自己处理这个问题,他们只是不这样做...... 例如:
echo * ;
这里shell将展开*并将其替换为当前目录中的所有文件名,并在执行命令echo *
之前将它们作为参数@传递给echo实用程序同样在你的情况下,shell正在将$ {1}扩展到你在执行命令之前传递的路径名.....这就是为什么你得到了你的东西。
解决方案:你可以使用大括号(当然是空的)或者更好的只是放下它们.......它对我来说很好.......
find . -iname "*${filename}*" | xargs ls -l | more commands ....;
希望这会有所帮助。
答案 2 :(得分:0)
您使用find + xargs会遇到分隔符问题https://en.wikipedia.org/wiki/Xargs#The_separator_problem
这是一个没有这个问题的解决方案。它使用GNU Parallel:
find . -name "output*.txt" | parallel cat {} | grep -v ${filter} > temp.txt
安装GNU Parallel需要花费10秒钟的时间:
wget pi.dk/3 -qO - | sh -x
观看介绍视频以了解详情:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1