2015-04-08 29 views

回答

0

当作为节目名称或参数使用的发生, {}bash或其他基于Bourne语法的shell中没有特别的含义或用法。它只是保持不变并传递给该实用程序。从技术上讲,什么都不禁止一个程序被称为{}

在另一方面,find效用-exec子句使用{}来表示匹配文件(一个或多个),例如:

find /tmp -name "*.txt" -exec ls -l {} + 

对于与find一致性,{}也使用默认或明确与xargs代表要被替换的字符串。

ls /tmp/*.txt | xargs -I {} ls -l {} 

注意,xargs的是你举的找到实例无用已经可以做的是预期本身:

find . -name "*.bak" -exec mv {} ~/old.files \; 
+0

所以'{}'在'find ... exec'命令中只有特殊含义,在其他'bash shell'情况下,它没有特别的含义,只是一个常见的文字。对? –

+1

的确如此。 – jlliagre

2

这是正确的,在你的问题:

{}作为参数列表标记

它被用作一个标记(占位符)的参数列表。例如,这就是将参数放入命令行的地方。因此,举例来说,如果你有两个文件匹配*.bakone.baktwo.bak),xargs将产生的命令是:

mv one.bak ~/old.files 
mv two.bak ~/old.files 

只是一个或两个段落进一步下跌:

您可以重命名{ }到别的东西。在下面的例子中{}被重命名为文件。这是更具可读性的比较前面的例子:

$ find . -name "*.bak" -print0 | xargs -0 -I file mv file ~/old.files 

本文不刻意去告诉你,但它的使用-I选项更改标记字符串。从info xargs

'-I REPLACE-STR'

'--replace [= REPLACE-STR]'

'-i [REPLACE-STR]'

更换发生REPLACE-STR在最初的参数中,从标准输入中读取 名称。此外,未加引号的空格不会终止参数;相反,输入仅在换行符处分割。 如果省略REPLACE-STR(省略只允许'-i'), 它默认为'{}'(如'find -exec')。意味着'-x'和'-l 1'。 '-i'选项不赞成使用'-I'选项。

2

{}是xargs.Your CMD关键字意味着找到所有*.bak file.And给每个.bak文件名xargs的为{}(使用-I {}选项)。所以,你可以在这里使用的文件名作为参数。

例如。如果发现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

+0

这不是xargs的关键字,它正是大多数人设置的内容。 –

+0

@JID'{}'不仅是大多数人设置'-I'的时候,而且省略了'-i'选项参数时默认使用的'xargs'。 – jlliagre

+0

@jlliagre我知道,它仍然不是一个关键字。 –