我想删除大小为 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太复杂了。
是什么{} \;意思?
你能给我解释一下吗?我的英语不是很好,所以请写简单。
{}对 绝对没有意义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)
与find命令的exec选项结合使用,该{}部分将替换为执行命令时找到的文件的名称。也\;很重要,因为它定义了正在执行的命令的结束
例如
find ~ -name \*.bak -exec -rm -f {} \;
将删除.bak以用户主目录或其中包含的文件夹中任意位置结尾的所有文件。通过执行rm -f找到的每个文件。
xargs获取标准输入行(通常来自管道),并在执行您给它的命令时从中形成参数的尾部部分
| 归档时间: |
|
| 查看次数: |
14974 次 |
| 最近记录: |