我使用它在子目录中查找具有特定名称的文件,然后编辑一些内容:
find prod -type f -name "file.txt" -exec sed -i '' -e "s,^varname.*$, varname = \"$value\"," {} +如何获取当前目录的名称(不是执行脚本的目录,而是找到文件的目录)并将其插入到替换文本中?类似于:
find prod -type f -name "file.txt" -exec sed -i '' -e "s,^ varname.*$, varname = \"$value/$dirname\"," {} +我希望把它当做一句笑话。我最近的一次尝试是这样的,但是替代方法不起作用,我觉得必须有一个更简单的语法:
find prod -type f -name "file.txt" -exec sh -c '
for file do
dirname=${file%/*}
done' sed -i '' -e "s,^varname.*$, varname = \"$value/$dirname\"," {} +示例:
value=barfile.txt输入:
varname = “foo”file.txt输出:
varname = “bar/directory_name”发布于 2019-07-16 03:07:14
您可以使用GNU awk以相同的方式完成此操作:
您使用的sed命令可以替换为:
$ awk --inplace -v v="$value" '(FNR==1){d=FILENAME;sub("/[^/]*$","",d)}/^varname/{$0="varname = "v"/"d}1'所以你的find应该是这样的:
$ find prod -type f -name "file.txt" -exec awk --inplace -v v="$value" '(FNR==1){d=FILENAME;sub("/[^/]*$","",d)}/^varname/{$0="varname = "v"/"d}1' {} \;发布于 2019-07-16 17:22:52
这可能适用于您(GNU sed和并行):
find prod -type f -name "file.txt" |
parallel -qa- --link sed -i 's#\(varname=\).*#\1"{2}{1//}"#' {1} ::: $value我们为并行命令提供了两个源代码。第一个源是使用并行选项-a -的find命令的文件列表。第二个源是变量$value,它只是一个使用并行选项--link链接到第一个源的值。sed命令使用parallel选项-q引用,除了值{2}和{1//}首先由parallel解释以分别表示第二个源和第一个源的目录之外,其他规则都适用于常规正则表达式。
注意:要检查并行命令是否符合您的要求,请使用--dryrun选项,并在实际运行之前检查输出。
发布于 2019-07-16 16:31:37
您需要使用-execdir并生成一个外壳:
find ... -execdir \
bash -c 'sed -i "" -e "s,^ varname.*$, varname = \"$value/${PWD}\"," "$1"' -- {} +-execdir在文件的父文件夹中运行sed,而不是在从中运行find的文件夹中运行。这允许使用$PWD。
进一步注意:我使用两个参数调用bash:
-exec bash -c '... code ...' -- {}
^^ ^^我将--作为占位符传递。当使用-c调用时,bash开始在$0而不是$1处索引参数。($0通常包含脚本的名称)。这允许使用$1作为来自{}的文件名,这是我更容易阅读和理解的。
https://stackoverflow.com/questions/57043551
复制相似问题