假设我有一些包含文件的目录。例如,目录
/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)。
我正在寻求计算两个输入值之间的文件数量。给出上面的示例,如果我的第一个值为 100,第二个值为 105,我希望输出为 3。如果第一个值为 103,第二个值为 106,我希望输出为 2。此外,假设我给出的第一个值是 112,第二个值是 125。我想进入相应的目录(以 11 和 12 结尾),并计算这两个值之间的文件数。
这是我正在使用的简化版本,但功能相同。什么方案可以实现这一点?谢谢!
答案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
)时,您都必须手动重新创建数据库,并且locate
无法用 NUL 替换找到的文件名,这将导致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 的答案会更容易......