bash shell中“{}”的功能是什么?

时间:2015-04-08 07:14:38

标签: linux bash unix

我正在阅读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的确切含义和功能,有人可以详细解释一下吗?

3 个答案:

答案 0 :(得分:2)

你的问题就在那里:

  

{}作为参数列表标记

它被用作参数列表的标记(占位符)。例如,参数将放在命令行中。例如,如果您有两个匹配*.bakone.baktwo.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}}