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
去“玩beingxargs
”。也就是说,每次执行时,它将使用尽可能多的文件名运行该命令
请注意,使用-exec
或-execdir
可以自动、全面地处理文件名中的空格(以及其他笨拙的字符-换行符、退格符、换行符、任何人?)问题。带有-打印到xargs
的管道名称在这里会出现问题。GNUfind
加上GNUxargs
提供了-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
的全部要点是,如果找到的文件数量很大,它将起作用。它将文件分成可管理的组,并为每个组执行命令。