bash查找具有相同后四个字符的文件名

时间:2017-12-07 13:43:55

标签: bash find

我想编写一个脚本来执行一个命令,该命令可以查找具有相同最后四个字符的每组文件。

例如,给定一个包含这些文件的目录,

$ ls -1
GH010119.MP4
GH010120.MP4
GH010126.MP4
GH010127.MP4
GH020119.MP4
GH020126.MP4
GH020127.MP4
GH030119.MP4
GH030126.MP4

我喜欢我的剧本来制作这些小组:

GH010119.MP4
GH020119.MP4
GH030119.MP4

GH010126.MP4
GH020126.MP4
GH030126.MP4

GH010127.MP4
GH020127.MP4

GH010120.MP4

我目前的解决方案是使用find . -name "*0119*"手动确定每个群组,因此我也想知道我必须提出的脚本是否胜过比较过于复杂......

3 个答案:

答案 0 :(得分:2)

使用perl

perl -e 'for (glob("*")){$f{$1}.="$&\n" if /.*(.{4}).MP4/}print "$_\n" for (values %f)'
GH010126.MP4
GH020126.MP4
GH030126.MP4

GH010120.MP4

GH010119.MP4
GH020119.MP4
GH030119.MP4

GH010127.MP4
GH020127.MP4

答案 1 :(得分:1)

我假设没有扩展名的文件名都是8个字符,并且不包含换行符:

printf "%s\n" * |
 sort -k1.5,1.8n |
 awk '{key = substr($0,5,4)} NR==1{prev=key} prev != key {print ""} {print; prev=key}'

如果文件名不是严格的8个字符,那么

for f in *; do
   root=${f%%.*}
   echo "${root: -4:4} $f"
done |
 sort -k1,1n |
 awk 'NR==1 {prev=$1} $1 != prev {print ""} {print $2; prev=$1}'

答案 2 :(得分:0)

您可以使用类似

的内容提取分组
printf '%s\n' *.MP4 | sed 's/.*\(........\)$/\1/' | sort -u

考虑到扩展名.MP4,它是文件名的一部分,无论你怎么看,它都会提取最后八个字符,并删除任何重复项。

在Awk中执行它可能会更有效率。

awk 'FNR == 1 { n = substr(FILENAME, length(FILENAME)-7);
    if (seen[n]++ == 0) print n; nextfile }' *.MP4