2013-03-25 72 views
0

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

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

我基本上一到这个点买入建设命令行中的find ...行,然后将其粘贴到我的脚本中,然后添加cd命令,以便在将在大量目录上运行此脚本的包装器中重复使用此脚本。反正...

的问题是,cdxargs使用相同的${1}变量,它有点makese

我知道,我可以从xargs${1}说法,我可能可以重写find命令不需要xargs可言,但我的问题是:

有没有一种方法来“复位” ${1}后,我用它来cd使xargs

回答

2

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

find . -name "output*.txt" | xargs -I '{}' cat '{}' | grep -v ${filter} > temp.txt 
0

效用xargs的只是管理参数的个数有牙套行为作为参数或文件名的占位符{}。

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

效用ARNT编码由自己来照顾这个之前完成,他们只是不这样做...... 例如:

echo * ; 

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

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

解决方法:你可以只使用大括号(空当然)或更好刚落,他们.......它工作正常,我.....

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

希望这会有所帮助。