bash - {} 是什么意思?

Adr*_*ian 7 bash

我想删除大小为 0 的文件。所以我试过:

find ./ -size 0 | xargs rm
Run Code Online (Sandbox Code Playgroud)

但是它有一个问题,文件名以空格开头。我找到了这个:

find ./ -size 0 -exec rm -i {} \;
Run Code Online (Sandbox Code Playgroud)

有用。我认为我的方式xargs太复杂了。

是什么{} \;意思?

你能给我解释一下吗?我的英语不是很好,所以请写简单。

jll*_*gre 8

{}对 绝对没有意义bash,因此将未经修改地作为参数传递给执行的命令,此处为find

另一方面,;具有特定含义bash。当它们在同一命令行上时,它通常用于分隔顺序命令。这里的反斜杠 in\;正是用于防止分号被解释为命令分隔符bash,然后允许将其作为参数传递给底层命令find. 引用分号,即";"';',可能是保持未处理状态的另一种方法。

命令:

find ./ -size 0 -exec rm -i {} \;
Run Code Online (Sandbox Code Playgroud)

意思是:在当前目录中查找(注意/这里没用,.无论如何只能是一个目录)任何大小为 0 的东西,对于找到的每个对象,运行命令rm -i name,即如果要删除,交互式提示每个文件它。{}由在执行的命令中找到的每个文件名替换。一个很好的特性是,无论文件名是什么(甚至包含嵌入的空格、制表符、换行符和任何字符),这个文件名都是严格的单个参数。xargs除非使用非便携式黑客,否则情况并非如此。最后;是结束-exec条款。其结束需要定界的原因是其他find选项可能会跟随在该选项之后-exec,尽管很少这样做。例如:

find . -name "*.js" -exec ls -l {} \; -name "special*" -exec wc -l {} \;
Run Code Online (Sandbox Code Playgroud)

此命令的一个问题是它不会忽略非纯文件,因此可能会提示用户删除套接字、块和字符设备、管道和目录。即使您回答“是”,后者也将始终失败。

另一个问题,虽然在这里不是很重要,但rm将为每个大小为零的文件调用。如果将-exec结尾替换为/;to +find则将通过仅调用rm尽可能少的次数(通常仅调用一次)来优化子流程的创建。

下面是我将如何修改此命令:

find . -type f -size 0 -exec rm -i {} +
Run Code Online (Sandbox Code Playgroud)

  • @The_IT_Guy_You_Don't_Like 事实并非如此。更准确地说,参数替换需要在“{”之前有一个“$”字符,并且需要在大括号之间至少存在一个变量名称。单独的“{}”对于 shell 来说没有任何意义,并且不会被 shell 改变。 (2认同)
  • @CGTheLegend 如果没有`+`,它就无法工作,因为`-exec` 表达式采用可变数量的参数,因此需要以正确解析的内容终止,并正确找到进一步的表达式。终止符可以是`+` 或`;`。 (2认同)

inf*_*xed 1

find命令的exec选项结合使用,该{}部分将替换为执行命令时找到的文件的名称。也\;很重要,因为它定义了正在执行的命令的结束

例如

find ~ -name \*.bak -exec -rm -f {} \;

将删除.bak以用户主目录或其中包含的文件夹中任意位置结尾的所有文件。通过执行rm -f找到的每个文件。

xargs获取标准输入行(通常来自管道),并在执行您给它的命令时从中形成参数的尾部部分