Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在没有大量转义的情况下使用find-exec_Bash - Fatal编程技术网

Bash 如何在没有大量转义的情况下使用find-exec

Bash 如何在没有大量转义的情况下使用find-exec,bash,Bash,我经常使用find在一堆文件上运行相同的脚本。因此,例如,如果我想在dir中的所有.png文件上运行process.py,我会: find dir -name '*.png' -execdir process.py \{\} \; 纠察队围栏的事最终是令人讨厌的,不管怎么说 使用: find dir -name '*.png' -execdir process.py {} + {}不需要转义;它们只有在相当有限的情况下才对壳牌公司有特殊的意义。(特别是,echo{}回显大括号,而echo{a

我经常使用
find
在一堆文件上运行相同的脚本。因此,例如,如果我想在
dir
中的所有
.png
文件上运行
process.py
,我会:

find dir -name '*.png' -execdir process.py \{\} \;
纠察队围栏的事最终是令人讨厌的,不管怎么说

使用:

find dir -name '*.png' -execdir process.py {} +
{}
不需要转义;它们只有在相当有限的情况下才对壳牌公司有特殊的意义。(特别是,
echo{}
回显大括号,而
echo{a,b,c}
回显
abc
+
也不需要转义。它告诉
find
去“玩being
xargs
”。也就是说,每次执行时,它将使用尽可能多的文件名运行该命令

请注意,使用
-exec
-execdir
可以自动、全面地处理文件名中的空格(以及其他笨拙的字符-换行符、退格符、换行符、任何人?)问题。带有
-打印
xargs
的管道名称在这里会出现问题。GNU
find
加上GNU
xargs
提供了
-print0
选项以
查找
,以及
-0
选项以
xargs
解决文件名中的奇数字符问题

如果必须对每个文件执行一次脚本,则需要在结尾处使用转义分号;没有简单的方法可以解决这个问题(除非您计算:
SC=“;”;查找…{}$SC
,我没有)

我看到的唯一问题是在子目录中运行脚本的
-execdir
。当在不同的目录中有不同的文件时,您必须检查它的行为是否正常,并且当与
-execdir
一起使用时,您需要确保
{}
转换为“相对于找到它的目录的文件名”(否则,通常无法通过脚本的名称定位文件)。所有这些都应该“正常工作”,因为如果选项不可用,它们就没有意义了


就我个人而言,我宁愿只使用普通的
-exec
,但您选择
-execdir
可能有一个很好的理由,您可以单引号{}相反,您必须以某种方式阻止shell本身解释这些字符。如果找到的字符数较少,xargs也可以工作。

根据您的键盘布局,
可能比
\
更方便使用。
{据Stack Exchange站点所知,
不需要转义。没有人能够识别需要转义的shell,
{}
,手册页中的示例也不需要转义大括号

find dir -name "*.png" -execdir process.py {} ";"

Jonathan Leffler最终提出了一个+的解决方案,该解决方案在语义上不尽相同,但通常是可用的。

Find本身会注意,它找到的文件会正确地传递到脚本中,无论您使用-exec还是-execdir,都不必担心。只是有时候在文件所在的目录中执行一个程序会很有用-重命名、重新命名读取一些配置信息,…为了可用,它几乎必须这样做。我没有使用
-execdir
(我必须查看手册页以了解它的功能)。我可以看出它有时可能会有点帮助,但我的脚本风格不会受到
-exec
-execdir
的影响,因为基本上我能想到的任何情况。对于人为的示例,我感到抱歉,但是@userunknown解决了这个问题:
process.py
所在的目录不仅仅是它找到的文件,所以相对路径很重要。这解决了问题。我喜欢,但我不想改变效果,只是为了避免键入所有\。至少这少了两个。我不确定我是否理解这一点:
Nowbody可以告诉shell,当它写在手册页中时,它需要屏蔽的地方。
do确实显示
“{}”
,但这显然不是bash所要求的(我已检查)。@Shep:由我开始。有趣的是,你说“
xargs
在找到的文件数量很少的情况下也可以工作“,因为
xargs
的全部要点是,如果找到的文件数量很大,它将起作用。它将文件分成可管理的组,并为每个组执行命令。