dav*_*cha 6 shell bash xargs quoting
我有以下命令:
ls /some/path/*dat | xargs -n 1 -I @ sh -c "echo `basename @`"
Run Code Online (Sandbox Code Playgroud)
目录/some/path/包含:
/some/path/a
/some/path/b
/some/path/c
/some/path/d
Run Code Online (Sandbox Code Playgroud)
我想得到输出:
a
b
c
d
Run Code Online (Sandbox Code Playgroud)
但我仍然得到完整的路径。我究竟做错了什么 ?
编辑:顺便说一句,我知道有一个更简单的方法,我可以运行basname而不是
echo `basename @`
Run Code Online (Sandbox Code Playgroud)
但我需要运行一个复杂的命令,比如
octave --silent --eval "somefunction('`basename @`','@',...))"
Run Code Online (Sandbox Code Playgroud)
编辑2:
这是实际的命令:
ls ~/phd/data/conll2012/dev.megam/*dat | xargs -P 16 -n 1 -I@ timeout -k 1s 15m sh -c "if [ ! -f '~/phd/xp/conll2012/dev.megam/@.$epsilon$mink$minn$alpha' ]; then octave --silent --eval \"xprp('~/phd/xp/conll2012/dev.megam/@.$epsilon$mink$minn$alpha.rp','@',$alpha,$mink,$minn,$epsilon);\" 2>> ~/xpgrid.log;fi"
Run Code Online (Sandbox Code Playgroud)
基本上,我在一个目录中有一组文件,这个命令以这些文件为基础,在另一个目录中输出结果,检查结果是否已经存在。
所以,我需要带有完整路径的文件和只有基本名称的文件。
如何让它发挥作用?开头的简单示例有助于使这一点更加清晰。
ls /some/path/*dat | xargs -n 1 -I @ sh -c 'echo `basename "@"`'
Run Code Online (Sandbox Code Playgroud)
在您的代码中执行basename得太早。
如果您不确定路径中没有空格或制表符,那么您应该使用-d \\n(或find ... -print0 | xargs -0 ...) 并"注意@.
| 归档时间: |
|
| 查看次数: |
4394 次 |
| 最近记录: |