我有一个目录,其中包含一些要根据文件后缀合并在一起的tif文件(请注意文件名中的空格):
File1 P1.tif
File1 P2.tif
File1 P3.tif
File2 P1.tif
File2 P2.tif
应该导致合并的tif:
File1.tif
File2.tif
我有
for i in *\ P1.tif; do
match=${i/\ P1/\ P*}
out=${i/\ P1/}
echo "processing $match"
tiffcp "$match" "$out"
done
$match
将包含File1 P*.tif
并且$out
将包含File1.tif
。但是tiffcp将第一个参数作为字符串处理,并且找不到匹配的文件。如果$match
在文件名的空格中不使用引号将导致没有匹配的文件
所以问题是:如何将全局字符串作为参数传递给命令?
如果希望在参数扩展时执行通配符(顺便说一句,它是在调用命令之前由外壳执行的;该命令会看到生成的文件,而不是模式),那么您将在此保留参数扩展名。
保留参数扩展名不加引号的含义是单词拆分和全局匹配(有时称为概念上的split + glob运算符)。在这里,您只需要通配部分,因此您需要禁用拆分部分(通过将空值分配给特殊$IFS
变量):
IFS= # disable splitting
for i in ./*\ P1.tif; do
match=${i/\ P1/\ P*}
out=${i/\ P1/}
echo "processing $match"
tiffcp $match "$out" # split+glob on $match
done
假定文件名的开头部分不包含通配符。或者,您可以执行以下操作:
for i in ./*\ P1.tif; do
prefix=${i%\ P1.tif}
out=$prefix.tif
echo "processing $prefix"
tiffcp "$prefix P"*.tif "$out"
done
这样,仅将*
其用作glob运算符,并且该代码还具有仅使用标准sh语法的优点。
注意,全局扩展按词法排序,因此P10在P2之前。使用zsh
及其numericglobsort
选项(或n
glob限定符)进行数字排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句