0

长话短说,我有一个看起来像这样的脚本块:

cd ${1} # via command-line argument
find . -name "output*.txt" | xargs cat ${1} | grep -v ${filter} > temp.txt

我基本上已经到了这一点,购买find ...在命令行中构建该行,然后将其粘贴到我的脚本中,然后添加cd命令以便在包装器中轻松重用此脚本,该包装器将在大量目录上运行此脚本。反正 ...

问题是cd并且xargs使用相同的${1}变量,哪种makee

我知道我可以${1}从 中删除参数xargs,并且我可以将find命令重写为根本不需要xargs,但我的问题仍然存在:

有没有办法${1}在我使用它之后“重置”,cd这样xargs就不会

4

3 回答 3

2

我不熟悉用作默认替换字符串的版本xargs${1}但以下应该可以工作:

find . -name "output*.txt" | xargs -I '{}' cat '{}' | grep -v ${filter} > temp.txt
于 2013-03-25T21:16:49.650 回答
1

您对 find + xargs 的使用遇到了分隔符问题https://en.wikipedia.org/wiki/Xargs#Separator_problem

这是一个没有该问题的解决方案。它使用 GNU 并行:

find . -name "output*.txt" |
  parallel cat {} |
  grep -v ${filter} > temp.txt

安装 GNU Parallel 实际上需要 10 秒:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

观看介绍视频以了解更多信息:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2013-04-19T22:21:55.130 回答
0

实用程序 xargs 仅用于管理参数的数量,并且大括号充当参数或文件名 {} 的占位符。

我确实模拟了你拥有的包装器,并且遇到了同样的问题,作为 ${1} 传递给我的函数的路径名被 xargs 拾取......但这就是 shell 的工作方式,实际上 shell 只是替换/扩展所有使命令在执行前完成的变量和东西

实用程序arnt编码自己处理这个问题,他们只是不这样做......例如:

echo * ;

在这里,shell 将扩展 * 并将其替换为当前目录中的所有文件名,并在执行命令 echo * 之前将它们作为参数 @ 传递给 echo 实用程序

同样,在您的情况下,shell 将 ${1} 扩展为您在执行命令之前传递的路径名值.....这就是为什么您得到了您所拥有的。

解决方案:您可以只使用大括号(当然是空的),或者最好只是放下它们......它对我来说很好......

find . -iname "*${filename}*" | xargs ls -l | more commands ....;

希望这可以帮助 。

于 2013-03-26T08:17:24.807 回答