列出文件夹中相似文件名的计数

List a count of similar filenames in a folder

我有一个文件夹,其中包含多个名称相似的文件(以文件名中的日期时间区分)

我希望能够获得该文件夹中每个文件 group/type 的计数。

file1_25102019_111402.csv
file1_24102019_111502.csv
file1_23102019_121402.csv
file1_22102019_101402.csv

file2_25102019_161404.csv
file2_24102019_131205.csv
file2_23102019_121306.csv

我需要能够return这样的东西;

file1 4
file2 3

理想情况下,答案应该是 "count of files whose first x characters are ABCD"

文件名可以是任何名称。示例中的日期部分只是为了证明文件名以相似的文本开头,但在名称中进一步区分 "something"(在本例中为日期)

所以我希望能够按文件名中的前 X 个字符对它们进行分组。

即我想说 "give me counts of all files grouped by the first 4 characters, or the first 5 characters etc."

在 SQL 我会做这样的事情

select   substr(object_name,1,5),
         count(*) 
from     all_objects 
group by substr(object_name,1,5)

已编辑以显示更多示例;

File1weifwoeivnw
File15430293fjwnc
File15oiejfiwem
File2sidfsfe
File29fu09f4n
File29ewfoiwwf
File22sdiufsnvfvs

伪代码:

示例 1:

ls count of first 4 characters

输出

File   7

示例 2:

ls count of first 5 characters

输出

File1    3
File2    4

示例 3

ls count of first 6 characters

输出

File1w    1
File15    2
File2s    1
File29    2
File22    1

如果你想提取前 5 个字符你可以使用

ls | cut -c1-5 | sort | uniq -c |awk '{ print , }'

打印问题中的第一个示例

file1 3
file2 3

如果您想要不同数量的字符,请根据需要更改 cut 命令,例如cut -c1-6 前 6 个字符。

如果要使用制表符而不是 space 分隔字段,请将 awk 命令更改为

awk -vOFS=\t '{ print , }'

这会导致

file1   3
file2   3

适用于第一个示例的其他解决方案,该示例显示带有日期和时间字符串的文件名,但不适用于稍后添加的其他示例:

对于您的第一个示例文件,命令

ls | sed 's/_[0-9]\{8\}_[0-9]\{6\}/_*/' | sort | uniq -c

打印

      3 file1_*.csv
      3 file2_*.csv

解释:

  • sed命令用_*.
    替换了一个_,8个数字,另一个_和另外6个数字的序列 使用您的第一个示例文件名,您将获得 file1_*.csvfile2_*.csv各3次。
  • sort 对行进行排序。
  • uniq -c 计算后续相等的行数。

或者如果你想删除从第一个 _ 到最后的所有内容,你可以使用

ls | sed 's/_.*//' | sort | uniq -c

这将打印

      3 file1
      3 file2

您可以添加第一个解决方案中的 awk 命令来更改输出格式。