regexpによって引数で渡された任意の数のファイルに対してtestコマンドを使用するにはどうすればよいですか?
例えば:
test -f /var/log/apache2/access.log.* && echo "exists one or more files"
しかし、mow printエラー:bash:テスト:引数が多すぎます
regexpによって引数で渡された任意の数のファイルに対してtestコマンドを使用するにはどうすればよいですか?
例えば:
test -f /var/log/apache2/access.log.* && echo "exists one or more files"
しかし、mow printエラー:bash:テスト:引数が多すぎます
この解決策は私にはより直感的に思えます:
if [ `ls -1 /var/log/apache2/access.log.* 2>/dev/null | wc -l ` -gt 0 ];
then
echo "ok"
else
echo "ko"
fi
「引数が多すぎるエラー」を回避するには、xargsが必要です。残念ながら、test -f
複数のファイルをサポートしていません。次のワンライナーが機能するはずです。
for i in /var/log/apache2/access.log.*; do test -f "$i" && echo "exists one or more files" && break; done
ところで、/var/log/apache2/access.log.*
正規表現ではなくシェルグロブと呼ばれています。これを確認してください:シェルグロブワイルドカードと正規表現との混同。
まず、ファイルを配列としてディレクトリに保存します。
logfiles=(/var/log/apache2/access.log.*)
次に、アレイのカウントでテストを実行します。
if [[ ${#logfiles[@]} -gt 0 ]]; then
echo 'At least one file found'
fi
ファイルごとに個別のアクションを実行するのではなく、ファイルのリストをバッチとして処理する場合は、検索を使用して結果を変数に格納し、変数が空でないかどうかを確認できます。たとえば、次を使用して、ソースディレクトリ内のすべての.javaファイルをコンパイルします。
SRC=`find src -name "*.java"`
if [ ! -z $SRC ]; then
javac -classpath $CLASSPATH -d obj $SRC
# stop if compilation fails
if [ $? != 0 ]; then exit; fi
fi
これは、非公式のBash Strictモードでの使用に適しています。ファイルが見つからない場合、noはゼロ以外の終了ステータスになります。
配列logfiles=(/var/log/apache2/access.log.*)
には常に少なくとも展開されていないグロブが含まれるため、最初の要素の存在を簡単にテストできます。
logfiles=(/var/log/apache2/access.log.*)
if [[ -f ${logfiles[0]} ]]
then
echo 'At least one file found'
else
echo 'No file found'
fi
ls
リストするものがあるかどうかをテストする必要があります。
ls /var/log/apache2/access.log.* >/dev/null 2>&1 && echo "exists one or more files"
テーマのバリエーション:
if ls /var/log/apache2/access.log.* >/dev/null 2>&1
then
echo 'At least one file found'
else
echo 'No file found'
fi
ls -1 /var/log/apache2/access.log.* | grep . && echo "One or more files exist."
またはfindを使用する
if [ $(find /var/log/apache2/ -type f -name "access.log.*" | wc -l) -gt 0 ]; then
echo "ok"
else
echo "ko"
fi
より単純化:
if ls /var/log/apache2/access.log.* 2>/dev/null 1>&2; then
echo "ok"
else
echo "ko"
fi