複数のディレクトリにある2つの対応する文字列間のファイル数を数えます。

複数のディレクトリにある2つの対応する文字列間のファイル数を数えます。

ファイルを含むディレクトリがあるとします。たとえば、ディレクトリ

/home/me/files/files_10
/home/me/files/files_11
/home/me/files/files_12

各ファイルには、最後の数字に対応するいくつかのファイルが含まれています。たとえば、/home/me/files/files_10 ディレクトリには次のファイルが含まれます。

/home/me/files/files_10/file_100.txt
/home/me/files/files_10/file_102.txt
/home/me/files/files_10/file_105.txt
/home/me/files/files_10/file_106.txt
etc

ファイル番号はますます大きくなりますが、必ずしもすべての番号を含める必要はありません(この場合、101、103、104が欠落しているため)。

2つの入力値間のファイル数を計算しようとしています。上記の例では、最初の値が100で2番目の値が105の場合、出力は3になります。最初の値が103で2番目の値が106の場合、出力は2になりたいです。また、私が提供する最初の値は112で、2番目の値は125であるとします。そのディレクトリ(11と12で終わる)に移動して、これら2つの値の間のファイル数を計算したいと思います。

これは私が使用するものの単純化されたバージョンですが、機能は同じです。これを達成できるソリューションは何ですか?ありがとうございます!

答え1

この試み、

 ls /home/test/files/*/file_{112..125}.txt 2> /dev/null | wc -l

答え2

もちろん使用することもできますが、あまりfind一般的ではありませupdatedblocate

まず、後続のコマンドで使用するupdatedb既存のファイルのデータベースを作成する必要があります。locate行って、 /home/me/files次の操作を行います。

updatedb --require-visibility 0 -o locate.db -U .

locateこれで、Bash構文で使用して{a..b} ファイルのリストを取得する準備が整いました。たとえば、

$ locate -d ./locate.db file_{112..125}.txt
./files_11/file_112.txt
./files_11/file_113.txt
./files_12/file_124.txt
./files_12/file_125.txt
$ locate -d ./locate.db file_{100..105}.txt
./files_10/file_100.txt
./files_10/file_102.txt
./files_10/file_105.txt
$ locate -d ./locate.db file_{103..106}.txt
./files_10/file_105.txt
./files_10/file_106.txt

見つかったファイルの数だけを表示するには、locate出力をパイプしますwc -l

このソリューションの利点は、locate非常に迅速に動作することです。

欠点は、新しいファイルが追加されたり、名前が変更されたり、使用されたりするたびにデータベースを手動inotifyで再生成する必要があり、見つかったファイル名をNULに変更できないため、ファイルに新しい行があると誤った戻りがlocate発生することです。wc -l彼らの名前で。

答え3

xからyまでの数字を含むファイル数のみを計算するには、次の手順を実行します。

$ tree files/
files/
├── file_100.txt
├── file_102.txt
├── file_105.txt
└── file_106.txt

0 directories, 4 files


$ start=103; end=106; echo files/* \
  | grep -o '[[:digit:]]*' \
  | awk '{ if ($1 >='$start' && $1 <= '$end') {++count}} END { print count }'
2

しかし、ファイル名にスペースや改行文字が含まれていないと確信していれば、@msp9011の答えは簡単です。

関連情報