sh
30分ごとに実行されるスクリプトを設定しようとしています。実行するたびに、ディレクトリに.RAWファイルが1つ以上あることを確認したいと思います。ファイル拡張子が見つかると別のコードが実行されますが、現在使用する正しいifステートメントが見つかりません。
このコード例は最も理想的なアプローチではないことを知っていますが、私が試したコードは次のとおりです。これは明らかに間違っています。
cd ./dir/
if [ ! -f "*.RAW"]; then
echo "No files!"
else
echo "Yes files!"
fi
.RAW 拡張子があるかどうかを正しくテストするには?
答え1
そしてzsh
:
files=(*.RAW(DN))
if (($#files)); then
echo Yes
else
echo No
fi
正しければ定期的な示唆したように、ファイル(または一般ファイルへのシンボリックリンク)-f
は次のとおりです。
file=(*.RAW(ND-.))
代わりに。
POSIX的に:
has_regfiles_by_extension() {
for ext do
for file in .*."$ext" ."$ext" *."$ext"; do
[ -f "$file" ] && return
done
return 1
done
}
if has_regfiles_by_extension RAW raw; then
echo YES
else
echo NO
fi
を使用するには、ls
次の手順を実行します。
if ls -Aq | grep -q '\.RAW$'; then
echo yes
else
echo no
fi
1つの利点は、ディレクトリを読み取れない場合(シェルglobの場合と同じように自動的に無視されるのではなく)、エラーメッセージが表示されることです。
答え2
あなたの例の答えはほぼ正確です。まず、".RAW"
テスト文字列を終了文字列から分離する必要があります]
。
if [ ! -f "*.RAW" ];
この場合、引用符の外側にアスタリスクを入れてシェルグローブを実行できます。したがって、完成したコマンドは次のようになります。
if [ ! -f *".RAW" ];
ただし、次のタスクを実行したい場合は、このアプローチはあまり役に立ちません。使用文書.RAW
。この場合、ディレクトリ内の各ファイルの拡張子を次のように比較します。
for file in "test/"*; do
if [ "${file##*.}" = "RAW" ]; then
echo "Found raw file"
fi
done
Bash 構文 ${var##*.} は、実行できる巧妙なシェル引数拡張の一部です。詳細は以下で確認できます。GNUウェブサイト。
答え3
すべての助けに感謝します。一部は動作しませんが。
しかし、他の質問に対する答えで見つけたコードをうまく実装しました! (https://unix.stackexchange.com/a/87476)
export DIR=./folder
if ls ${DIR}/*.RAW &>/dev/null
then
echo "Yes!"
else
echo "No!"
fi
答え4
2つのBourne Shellソリューション
Bourneシェルを使用してください(配列またはシェルオプションはサポートされていません。)空のボールまたはグローバル障害)globが見つからない場合は、ゼロ以外の終了状態またはglob自体が返されるという事実を処理する必要があります。たとえば、
if [ -n "`ls *.RAW 2> /dev/null`" ]; then
echo "At least one RAW file found!"
else
echo "No RAW files found."
fi
一般的に言えば、依存してはいけません。エルエスこれはコマンドですが、これはユースケースには十分で、Bourneシェルの制限を解決します。実際、シェル組み込み機能のみを使用するには、割り当てを使用し、glob自体をエラー条件として明示的にテストする必要があります。たとえば、
files=*.RAW
if [ "$files" = "*.RAW" ]; then
echo "No RAW files found."
else
echo "At least one RAW file found!"
fi