ファイル数をカウントするBashスクリプト


11

スクリプトがあり、ファイルが存在するかどうかに応じて異なるメッセージを表示したい。次のようなスクリプトがあります。

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

ただし、ファイルが存在しない場合、これはNo such file or directory0ファイルではなく表示されます。ディレクトリ内に/import/ディレクトリがあるので、lsコマンドを実行することはできません。コマンドは常に0より大きい値を返します。

特定の拡張子(.zip、.gzなど)のファイルの数をカウントし、bashスクリプトでその値を使用してファイルの数を表示し、それをifステートメントで使用して異なるメッセージを表示するにはどうすればよいですか?

回答:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
私は、現在のディレクトリ内のファイルをカウントする1 -maxdepth追加
ウォレスショーン

1
これを呼び出すときに現在のディレクトリに.zipファイルが存在する場合は、おそらく '* .zip'を引用する必要があります。 (1)。
フィルP

4

これで試してください:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

アイデアは、ビットバケットに送信することでSTDERRに出力される「no such file」エラーを隠し、数値を比較するために適切なテスト機能を使用することです。(-gt「より大きい」の略です。もあります-eq-lt-ge、など)


別の方法として、次のこともできますcount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

確かに、それls /import/*.zipはサブディレクトリがある場合とは異なる意味を持っています
Mat

サブディレクトリ内のファイルをカウントしないようにmaxdepthを設定し、-gtを使用するようにスクリプトを更新しました。助けてくれてありがとう
ウォレスショーン

ディレクトリ内のファイルが多すぎてls呼び出しのargvに収まらない場合、これは失敗します。
フィルP

ああ、そう。findバリアントで修正されました。
マット

0

スクリプトを試してみましたが、予想どおり、一致するファイルがない場合、出力に0個のファイル表示されますが、ls直前のエラーも表示されます。これを解決するのは非常に簡単で、捨てる必要はありませんls。最初の行を次のように置き換えてください:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/null/dev/nullエラーメッセージを抑制して、stderrをにリダイレクトします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.