如何为每个给定的输入行使xargs执行一次命令?它的默认行为是将行块化并执行一次命令,将多行传递给每个实例.
来自http://en.wikipedia.org/wiki/Xargs:
find/path -type f -print0 | xargs -0 rm
在此示例中,查找使用长文件名列表输入xargs.然后xargs将此列表拆分为子列表,并为每个子列表调用rm一次.这比这个功能相同的版本更有效:
find/path -type f -exec rm'{}'\;
我知道find有"exec"标志.我只是引用另一个资源的说明性示例.
cat a.txt | xargs -I % echo %
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,xargs echo %用作命令参数.但在某些情况下,我需要多个命令来处理参数而不是一个.例如:
cat a.txt | xargs -I % {command1; command2; ... }
Run Code Online (Sandbox Code Playgroud)
但是xargs不接受这种形式.我知道的一个解决方案是我可以定义一个函数来包装命令,但它不是一个管道,我不喜欢它.还有其他解决方案吗?
$ ls *mp3 | xargs mplayer
Playing Lemon.
File not found: 'Lemon'
Playing Tree.mp3.
File not found: 'Tree.mp3'
Exiting... (End of file)
Run Code Online (Sandbox Code Playgroud)
我的命令失败,因为文件"Lemon Tree.mp3"包含空格,因此xargs认为它是两个文件.我可以使find + xargs使用这样的文件名吗?
我正在尝试将一堆文件复制到目录下,并且许多文件的名称中都有空格和单引号.当我尝试串联find和grep使用时xargs,我收到以下错误:
find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote
Run Code Online (Sandbox Code Playgroud)
有关更强大的xargs使用的任何建议?
这是在带有BSD的Mac OS X 10.5.3(Leopard)上xargs.
考虑这个命令:
ls /mydir/*.txt | xargs chown root
Run Code Online (Sandbox Code Playgroud)
目的是将所有文本文件的所有者更改mydir为root
问题是,如果没有.txt文件,mydir则xargs会发出一条错误,指出没有指定路径.这是一个无害的例子,因为被抛出一个错误,但在某些情况下,如在我需要在这里使用的脚本,假设一个空白的路径是当前目录.因此,如果我/home/tom/从那时起运行该命令,如果没有结果,ls /mydir/*.txt并且所有文件/home/tom/都将其所有者更改为root.
那么我如何让xargs忽略空结果呢?
我想找一个bash命令,让我grep目录中的每个文件,并将该grep的输出写入一个单独的文件.我的猜测是做这样的事情
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,xargs不喜欢双引号.但是,如果我删除双引号,则命令会将整个命令的输出重定向到名为"{}"的单个文件.而不是一系列单个文件.
有没有人知道使用xargs做到这一点的方法?我只是用这个grep场景作为例子来说明我对xargs的问题,所以任何不使用xargs的解决方案都不适用于我.
我试图使用xargs并行调用更复杂的函数.
#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0
Run Code Online (Sandbox Code Playgroud)
这将返回错误
xargs: echo_var: No such file or directory
Run Code Online (Sandbox Code Playgroud)
关于如何使用xargs来完成此任务或任何其他解决方案的任何想法都将受到欢迎.
我目前有当前的脚本.
#!/bin/bash
# script.sh
for i in {0..99}; do
script-to-run.sh input/ output/ $i
done
Run Code Online (Sandbox Code Playgroud)
我希望使用xargs并行运行它.我试过了
script.sh | xargs -P8
Run Code Online (Sandbox Code Playgroud)
但这样做只在当时执行一次.也没有运气-n8.添加&在脚本for循环中执行的行的末尾将尝试一次运行脚本99次.如何在当时仅执行8次循环,最多100次.
我正在尝试运行以下命令:
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
Run Code Online (Sandbox Code Playgroud)
其中"foobar"是我的.bashrc文件中定义的别名或函数(在我的例子中,它是一个带有一个参数的函数).显然xargs不会将这些视为可以运行的东西.有没有一种聪明的方法可以解决这个问题?
我有一个包含许多0字节文件的目录.我使用ls命令时甚至看不到文件.我正在使用一个小脚本删除这些文件,但有时甚至不删除这些文件.这是脚本:
i=100
while [ $i -le 999 ];do
rm -f file${i}*;
let i++;
done
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以更快地完成这项工作?