计算多个目录中两个对应字符串之间的文件数

计算多个目录中两个对应字符串之间的文件数

假设我有一些包含文件的目录。例如,目录

/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但也可以使用不太常用的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)时,您都必须手动重新创建数据库,并且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 的答案会更容易......

相关内容