我想编写一个脚本来执行一个命令,该命令可以查找具有相同最后四个字符的每组文件。
例如,给定一个包含这些文件的目录,
$ 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*"
手动确定每个群组,因此我也想知道我必须提出的脚本是否胜过比较过于复杂......
答案 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