ファイルサフィックスに基づいて一緒にマージしたいいくつかの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
。しかし、tiffcpは最初の引数を文字列として扱い、一致するファイルを見つけることができません。ファイル名のスペースを引用しないと、一致するファイルは生成されません。$out
File1.tif
$match
したがって、質問は次のようになります。ワイルドカード文字列をコマンドの引数としてどのように渡しますか?
ベストアンサー1
パラメータ拡張中にワイルドカードを実行するには(コマンドを呼び出す前にシェルによって実行され、コマンドはパターンではなく結果ファイルを確認します)、パラメータ拡張を除いてそのままにすることができます。引用符。
引用符のない引数拡張とは、単語分割とワイルドカード(概念的な分割+グローブ演算子とも呼ばれる)を意味します。ここではワイルドカード部分のみが必要なので、分割部分を無効にする必要があります($IFS
特殊変数にnull値を割り当てることによって)。
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
オプション(またはglob修飾子)を使用してください。n