find . | grep "B02_10m.tif$"
端末でこのコードを実行すると、B02_10m.tifで終わるすべてのファイルを取得できます。ただし、一部の処理では、acファイルへの入力としてこのリストが必要です。入力は、スクリプトパラメータの一部として渡されるLinux変数でなければなりません。
./avg outAVG $files
ここで、 $files は最初のフラグメントの結果を含む変数です。
それは可能ですか?私は努力しました:
files = $(find . | grep "B02_10m.tif$")
Command 'files' not found, did you mean:
command 'file2' from deb file-kanji
command 'file' from deb file
Try: sudo apt install <deb name>
しかし、それはうまくいきませんでした。
ベストアンサー1
bash
シェルを使用しているとします。
shopt -s globstar nullglob dotglob
./avg outAVG ./**/*B02_10m.tif
avg
これは現在のディレクトリまたはその下にあるファイル名でプログラムを呼び出します。まず、グローブモードをB02_10m.tif
有効にしてこれを行います。このパターンは「再帰的に」サブディレクトリと一致します。 TIFFファイルがある場合**
shopt -s globstar
現在の**
ディレクトリにはパターンのこの部分は必要ありません。
他の2つのシェルオプションは、ワイルドカードパターンが隠された名前と一致することを確認し、一致するものがない場合find
。
zsh
シェルを使用している場合は、次のものを使用できます。
./avg outAVG ./**/*B02_10m.tif(.DN)
これは同じことをします。同様に、TIFFイメージが保存されているディレクトリを知っていれば、**
モードビットは必要なく、代わりにそのディレクトリに正しいパスを挿入できます。
同様のシェルのファイルsh
がディレクトリにある場合は、$dir
次のものを使用できます。
./avg outAVG "$dir"/*B02_10m.tif
これは明らかにサブディレクトリの再帰検索を実行しません$dir
。
あなたの方法は2つの理由で動作しません。
変数の割り当てに構文エラーがあります
files
。=
課題には周囲の空白があってはなりません。構文エラーを修正するために、複数の個別のファイル名を単一の文字列に結合しました。これにより、ファイル名に通常シェルワイルドカードとして使用されるスペースと文字が含まれる可能性があるという事実は無視されます。後で引用符を使用しないと、
$files
シェルは文字列を空白文字(デフォルト)から複数の単語に分割し、シェルのワイルドカードパターンのように見えるすべての単語を展開します。常に非常に単純なファイル名を使用しないと、コードが誤動作します。
これらの問題の詳細については、次を参照してください。
- 」検索結果を繰り返すのはなぜ悪い習慣ですか?
find
"(どんな内容でも印刷されたファイル名に基づいて)、 - 」スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?「(参照変数に関連)および
- 」なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)「(使用
ls
に関してあなたのコメントの1つ)。