Emm*_*maV 15 shell bash find quoting arguments
如果我有一个目录,其中包含一些名称有空格的文件,例如
$ ls -1 dir1
file 1
file 2
file 3
Run Code Online (Sandbox Code Playgroud)
我可以成功地将它们全部复制到另一个目录,如下所示:
$ find dir1 -mindepth 1 -exec cp -t dir2 {} +
Run Code Online (Sandbox Code Playgroud)
但是,输出find dir1 -mindepth 1
包含未转义的空格:
$ find dir1 mindepth 1
dir1/file 1
dir1/file 3
dir1/file 3
Run Code Online (Sandbox Code Playgroud)
如果我使用print0
而不是print
,输出仍然包含未转义的空格:
$ find dir1 mindepth 1 -print0
dir1/file 1dir1/file 2dir1/file 3
Run Code Online (Sandbox Code Playgroud)
要使用 手动复制这些文件cp
,我需要对空格进行转义;但是当cp
的参数来自时,这似乎是不必要的find
,无论我是否使用+
或\;
在命令末尾。
这是什么原因?
的find
命令直接执行该命令。该命令,包括文件名参数,将不会被 shell 或任何其他可能修改文件名的东西处理。这是非常安全的。
您是正确的,无需转义命令行{}
上由 表示的文件名find
。
find
将原始文件名从磁盘直接传递到-exec
命令的内部参数列表中,在您的情况下,是cp
命令。
问题分为两部分:
find
设法调用程序-exec
,以及-print0
?首先,find
是进行系统调用,实际上是一组称为"exec"的相关调用中的一个。它将文件名作为参数直接传递给此调用,然后直接传递(在创建新进程之后)而不会丢失有关文件名的信息。
SVR4
find
实用程序的一个特点是-exec
主要的 + 终止符。这允许将包含特殊字符(尤其是换行符)的文件名组合在一起,而不会出现将此类文件名通过管道传输到xargs
. 其他实现添加了其他方法来解决此问题,特别是-print0
使用空字节终止符写入文件名的主要方法。此处考虑过,但未采用。使用空终止符意味着任何要处理 find-print0
输出的实用程序 都必须添加一个新选项来解析它现在将读取的空终止符。
“特别是-print0
主要的”指的是 GNU find
,xargs
它以不同的方式解决问题。FreeBSDfind
和xargs
. 如果您在调用中添加了一个-0
选项(请参阅手册页)xargs
,则该程序接受以“空字节”字符结尾的行。反过来,xargs
调用exec -functions 来完成它的工作。-print0
and-0
特性与+
特性之间的主要区别在于,前者通过管道传递文件名,而后者则不然。开发人员可以找到几乎所有功能的用途;管道也不例外。
回到 OP 的例子,它使用了一个-t
选项cp
:在POSIX cp 中找不到。相反,它是GNU cp提供的扩展(又名“非标准功能”)。的-0
扩展xargs
不会改进这个例子,但在其他情况下它可以有效地使用——记住有可移植的替代品+
,GNUfind
接受。
归档时间: |
|
查看次数: |
10004 次 |
最近记录: |