ファイルを含むディレクトリがあるとします。たとえば、ディレクトリ
/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
一般的ではありませupdatedb
んlocate
。
まず、後続のコマンドで使用する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の答えは簡単です。