列出文件夹中相似文件名的计数
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_*.csv
或
file2_*.csv
各3次。
sort
对行进行排序。
uniq -c
计算后续相等的行数。
或者如果你想删除从第一个 _
到最后的所有内容,你可以使用
ls | sed 's/_.*//' | sort | uniq -c
这将打印
3 file1
3 file2
您可以添加第一个解决方案中的 awk
命令来更改输出格式。
我有一个文件夹,其中包含多个名称相似的文件(以文件名中的日期时间区分)
我希望能够获得该文件夹中每个文件 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_*.csv
或file2_*.csv
各3次。sort
对行进行排序。uniq -c
计算后续相等的行数。
或者如果你想删除从第一个 _
到最后的所有内容,你可以使用
ls | sed 's/_.*//' | sort | uniq -c
这将打印
3 file1
3 file2
您可以添加第一个解决方案中的 awk
命令来更改输出格式。