在并行命令中实现Bash字符串替换

3

我正在并行运行gdalinfo命令,以从*.tif文件中获取统计信息。

find *tif -printf "%f\n" | parallel -j 5 "/usr/local/bin/gdalinfo -mm -stats -hist -json {} > {}.json"

{}将被正在处理的文件替换,例如SRTM.tif,因此输出文件名为:SRTM.tif.json

如何在{}上进行字符串替换?

在Bash中使用循环,我通常会使用${f%.tif}.json,但这不起作用(我们没有一个bash变量),也尝试过awk,但没有成功。


1
find ... | cut -d"." -f1 | parallel ... 怎么样? - Walter A
最终的命令将是: find *tif -printf "%f\n" | cut -d "." -f1 | parallel -j 5 "/usr/local/bin/gdalinfo -mm -stats -hist -json {}.tif > {}.json" - Jorge Mendes
请注意您的find命令,确保您想要执行的是find *tif-printf "%f\n"(它会查找所有路径下的tif文件),而不是find . -type f -name '*tif'(它只会在当前目录下查找以tif结尾的文件并进行打印)。 - Ljm Dullaart
2个回答

3
在并行处理中,{.}是没有扩展名的输入行。因此,请使用它来替代{}。如果您真的想进行复杂的字符串操作,请使用{= perl expression=}

0

你可以找到类似于tif文件的东西

find . -name "*.tif" -print | cut -d "." -f1 |
   parallel -j 5 "/usr/local/bin/gdalinfo -mm -stats -hist -json {}.tif > {}.json"

编辑:或者,根据其他回答的建议:

find . -name "*.tif" -print | 
   parallel -j 5 "/usr/local/bin/gdalinfo -mm -stats -hist -json {.}.tif > {.}.json"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接