文字列変数をコマンドにワイルドカード引数として渡す方法

文字列変数をコマンドにワイルドカード引数として渡す方法

ファイルサフィックスに基づいて一緒にマージしたいいくつかの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は最初の引数を文字列として扱い、一致するファイルを見つけることができません。ファイル名のスペースを引用しないと、一致するファイルは生成されません。$outFile1.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

おすすめ記事