23

regexpによって引数で渡された任意の数のファイルに対してtestコマンドを使用するにはどうすればよいですか?

例えば:

test -f /var/log/apache2/access.log.* && echo "exists one or more files"

しかし、mow printエラー:bash:テスト:引数が多すぎます

4

10 に答える 10

45

この解決策は私にはより直感的に思えます:

if [ `ls -1 /var/log/apache2/access.log.* 2>/dev/null | wc -l ` -gt 0 ];
then
    echo "ok"
else
    echo "ko"
fi
于 2014-08-05T13:52:25.130 に答える
7

「引数が多すぎるエラー」を回避するには、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.*正規表現ではなくシェルグロブと呼ばれています。これを確認してください:シェルグロブワイルドカードと正規表現との混同

于 2013-02-08T04:27:46.333 に答える
5

まず、ファイルを配列としてディレクトリに保存します。

logfiles=(/var/log/apache2/access.log.*)

次に、アレイのカウントでテストを実行します。

if [[ ${#logfiles[@]} -gt 0 ]]; then
  echo 'At least one file found'
fi
于 2018-03-02T20:55:07.267 に答える
4

ファイルごとに個別のアクションを実行するのではなく、ファイルのリストをバッチとして処理する場合は、検索を使用して結果を変数に格納し、変数が空でないかどうかを確認できます。たとえば、次を使用して、ソースディレクトリ内のすべての.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
于 2014-04-25T18:24:35.147 に答える
4

これは、非公式の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
于 2018-06-27T12:22:01.820 に答える
1

lsリストするものがあるかどうかをテストする必要があります。

ls /var/log/apache2/access.log.* >/dev/null 2>&1 && echo "exists one or more files"
于 2015-07-18T08:11:22.830 に答える
1

テーマのバリエーション:

if ls /var/log/apache2/access.log.* >/dev/null 2>&1
then 
  echo 'At least one file found'
else
  echo 'No file found'
fi
于 2017-03-23T10:24:49.627 に答える
0
ls -1 /var/log/apache2/access.log.* | grep . && echo "One or more files exist."
于 2014-10-17T10:59:32.663 に答える
0

またはfindを使用する

if [ $(find /var/log/apache2/ -type f -name "access.log.*" | wc -l) -gt 0 ]; then
  echo "ok"
else
  echo "ko"
fi
于 2018-05-17T13:05:53.250 に答える
0

より単純化:

if ls /var/log/apache2/access.log.* 2>/dev/null 1>&2; then
   echo "ok"
else
   echo "ko"
fi
于 2020-05-04T12:43:49.467 に答える