我正在阅读xargs: How To Control and Use Command Line Arguments,并找到以下示例:
{} as the argument list marker
......
$ find . -name "*.bak" -print0 | xargs -0 -I {} mv {} ~/old.files
我无法弄清楚{}
中bash shell
的确切含义和功能,有人可以详细解释一下吗?
答案 0 :(得分:2)
你的问题就在那里:
{}作为参数列表标记
它被用作参数列表的标记(占位符)。例如,参数将放在命令行中。例如,如果您有两个匹配*.bak
(one.bak
和two.bak
)的文件,则生成的命令xargs
将为:
mv one.bak ~/old.files
mv two.bak ~/old.files
再往下一段或两段:
您可以将{}重命名为其他内容。在以下示例中,{}被重命名为file。与前面的示例相比,这更具可读性:
$ find . -name "*.bak" -print0 | xargs -0 -I file mv file ~/old.files
该文章并不打算告诉您,但是它使用-I
选项来更改标记字符串。来自info xargs
:
' - I REPLACE-STR'
' - 取代[= REPLACE-STR]'
' - I [REPLACE-STR]'
用初始参数替换REPLACE-STR的出现次数 从标准输入读取的名称。此外,不带引号的空白不会 终止参数;相反,输入仅在换行符处拆分。 如果省略REPLACE-STR(省略只允许'-i'), 它默认为'{}'(就像'find -exec'一样)。意味着'-x'和'-l 1。不推荐使用'-i'选项,而选择'-I'选项。
答案 1 :(得分:2)
{}
是xargs的关键字。您的cmd意味着找到所有*.bak
文件。并将每个.bak
文件名作为{}
提供给xargs(使用-I {}选项)。所以你可以在这里使用文件名作为参数。
例如。如果find cmd为您提供
的输出1.bak
2.bak
3.bak
此处的每个文件名都将xargs
作为{}
。因此mv {} ~/old.files
将转换为
mv 1.bak~ / old.files
mv 2.bak~ / old.files
mv 3.bak~ / old.files
假设您要将每个.bak
文件重命名为.bak.2015-04-01
。您必须在mv cmd中使用两次文件名。
mv 1.bak 1.bak.2015-04-01
您可以使用
实现这一目标 find . -name "*.bak" -print0 | xargs -0 -I {} mv {} {}.2015-04-01
答案 2 :(得分:0)
当用作程序名称或参数时,{}
在bash
或其他基于Bourne语法的shell中没有特定含义或用法。它只是保持不变并传递给实用程序。从技术上讲,甚至没有禁止将程序称为{}
。
另一方面,find
实用程序-exec
子句使用{}
来表示匹配的文件,例如:
find /tmp -name "*.txt" -exec ls -l {} +
为了与find保持一致,默认情况下也会使用{}
或xargs
显式地使用ls /tmp/*.txt | xargs -I {} ls -l {}
来表示要替换的字符串。
find . -name "*.bak" -exec mv {} ~/old.files \;
请注意,xargs在您引用的示例中没用,因为find已经可以执行预期的操作:
{{1}}