如何使用通过 xargs 管道传输的查找输出对文件列表运行多个 sed 命令

Pra*_*rla 1 sed find xargs

这是我尝试过的:

find . -name *.sv | xargs sed -i -e '<command>' -e '<command>'
Run Code Online (Sandbox Code Playgroud)

这是行不通的。在每个文件上使用完全相同的命令仍然有效。

谢谢您的帮助。

Kus*_*nda 5

要强制一次xargs只执行sed一个文件,请使用-n 1with xargs。您还应该从findusing传递路径名并通过-print0getxargs接收它们-0(如果您findxargs支持这些非标准选项),以便正确处理包含空格等的路径名。您可能还需要指定您正在查找常规文件(而不是目录等),并且您肯定需要引用该 shell glob(或者它可能会扩展到当前目录中的任何匹配文件名):

find . -type f -name '*.sv' -print0 | xargs -0 -n 1 sed -i -e '<command>' -e '<command>'
Run Code Online (Sandbox Code Playgroud)

或者,只需使用find

find . -type f -name '*.sv' -exec sed -i -e '<command>' -e '<command>' {} ';'
Run Code Online (Sandbox Code Playgroud)

有关的:


一个不使用find,而是使用**globbing 模式(“递归地”匹配到子目录中)的解决方案在执行bash后可用shopt -s globstar

find . -type f -name '*.sv' -print0 | xargs -0 -n 1 sed -i -e '<command>' -e '<command>'
Run Code Online (Sandbox Code Playgroud)

在应用命令之前,此循环遍历所有具有文件名后缀的文件,.sv并测试每个匹配的名称是否是常规文件(我们必须单独测试! -h以确保它不是常规文件的符号链接)sed。shell 选项允许使用**( globstar)、匹配隐藏名称 ( dotglob),如果不匹配则完全删除模式 ( nullglob)。

或者,使用默认情况下zsh**启用的外壳,并且可以使用“全局限定符”来完成大部分bash必须显式完成的“额外”工作:

find . -type f -name '*.sv' -exec sed -i -e '<command>' -e '<command>' {} ';'
Run Code Online (Sandbox Code Playgroud)

glob 限定符(.DN)修改了前面的 globbing 模式,使其只匹配常规文件,匹配隐藏名称,如果根本没有匹配,则扩展为空。