私はこれが簡単だと思いました。しかし、わかると、私が予想したよりも複雑でした。
ディレクトリ内の特定の種類のすべてのファイルを繰り返したいので、次のように作成します。
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
これは効果があります一致するファイルが1つ以上ある場合ディレクトリに。ただし、一致するファイルがない場合は、次の結果が表示されます。
current file is *.zip
次に、次のことを試してください。
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
ファイルが存在しない場合、ループ本体は実行されませんが、lsでエラーが発生します。
ls: *.zip: No such file or directory
一致しないファイルをきれいに処理するためにループを作成するにはどうすればよいですか?
ベストアンサー1
では、パターンと一致しないパターンがリテラル文字列として処理されるのではなく、「消える」オプションをbash
設定できます。nullglob
shopt -s nullglob
for fname in *.zip ; do
echo "current file is ${fname}"
done
POSIXシェルスクリプトでは、それが存在するかどうかをfname
確認できます(また、[ -f ]
/ fifo / devices ...ディレクトリなどの他の種類ではなく、通常のファイル(または一般ファイルへのシンボリックリンク)であることを確認してください):
for fname in *.zip; do
[ -f "$fname" ] || continue
printf '%s\n' "current file is $fname"
done
名前が任意のタイプで終わるすべての(非表示)ファイルを繰り返すには、に[ -f "$fname" ]
置き換えます。[ -e "$fname" ] || [ -L "$fname ]
.zip
で終わる名前も考慮したい場合*.zip
。.*.zip .zip *.zip
.zip