我想一次运行多个带有不同参数的python脚本。
在尝试这样做时,我遇到了这个xargs
命令;我想了解它。
尝试此示例命令echo {a..d} | xargs -n 1 -I % mv % %-01
时,它可以在我的MacBook上运行并提供所需的输出。
但是在我登录运行Ubuntu 16.04的VPS并发出相同的命令后,我得到了这个mv: cannot stat 'a b c d': No such file or directory
我查看了手册页并搜索了但找不到任何理由。
ps:我猜xargs是默认Ubuntu repo的最新版本。
(这是我关于SO的第一个问题)。
答案 0 :(得分:2)
您的echo
命令会生成一行以空格分隔的输出:
$ echo {a..d}
a b c d
虽然通常xargs
需要以空格分隔的输入,但使用-I 时,它需要换行符分隔的输入。从手册页:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with names
read from standard input. Also, unquoted blanks do not terminate in‐
put items; instead the separator is the newline character. Implies -x
and -L 1.
您现有的命令行会生成以下命令:
mv a b c d a b c d-01
您需要将echo
命令的输出分成多行:
$ echo {a..d} | tr ' ' '\n' | xargs -n 1 -I % echo mv % %-01
mv a a-01
mv b b-01
mv c c-01
mv d d-01
正如您所指出的,您可以将上面的tr ...
替换为xargs -n1
,这会给您相同的结果:因为没有-I
xargs会读取以空格分隔的参数,导致在一个单独的行上回显每个参数。