在 xargs 下回显 basename?

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)

基本上,我在一个目录中有一组文件,这个命令以这些文件为基础,在另一个目录中输出结果,检查结果是否已经存在。

所以,我需要带有完整路径的文件和只有基本名称的文件。

如何让它发挥作用?开头的简单示例有助于使这一点更加清晰。

Hau*_*ing 4

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 ...) 并"注意@.

  • 或者如果使用 GNU `find`,则使用 `-printf '%f\0'`,这样您甚至不需要 `basename`。`(cd /some/path && printf '%s\0' *dat)` 可能更有意义。 (3认同)