这是我尝试过的:
find . -name *.sv | xargs sed -i -e '<command>' -e '<command>'
Run Code Online (Sandbox Code Playgroud)
这是行不通的。在每个文件上使用完全相同的命令仍然有效。
谢谢您的帮助。
要强制一次xargs
只执行sed
一个文件,请使用-n 1
with xargs
。您还应该从find
using传递路径名并通过-print0
getxargs
接收它们-0
(如果您find
并xargs
支持这些非标准选项),以便正确处理包含空格等的路径名。您可能还需要指定您正在查找常规文件(而不是目录等),并且您肯定需要引用该 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 模式,使其只匹配常规文件,匹配隐藏名称,如果根本没有匹配,则扩展为空。
归档时间: |
|
查看次数: |
2065 次 |
最近记录: |