zsh globbing - 查找具有重复文件名字符串的文件

zsh globbing - 查找具有重复文件名字符串的文件

我有一个文件名格式为 的文件目录<num1>v<num2>.txt。我想找到所有<num1>重复的文件。当发现重复项时,我们应该删除那些较小的<num2>

这可能吗?我可以轻松编写一个 python 脚本来处理这个问题,但我认为这可能是内置 zsh 功能的一个很好的应用程序。

例子

在以下文件列表中,前三个文件有重复的<num1>部分。同样,第四个和第五个是重复的。

012345v1.txt
012345v2.txt
012345v3.txt
3333v4.txt
3333v7.txt
11111v11.txt

我想最终得到包含以下内容的目录

012345v3.txt
3333v7.txt
11111v11.txt

答案1

你可以这样做:

files=(<->v<->.txt(n))
typeset -A h
for f ($files) h[${f%%v*}]=$f
keep=($h)
echo rm ${files:|keep}

echo(如果高兴就删除)

  • <->:任何数字序列(<x-y>没有指定界限的全局运算符)
  • (n): 数字排序
  • ${f%%v*}:标准/ksh 贪婪模式从末尾剥离。
  • ${files:|keep}:数组减法。

答案2

我对 shell 不太熟悉zsh,我使用下面的awk命令组合 和findsort对首先找到的文件进行排序natural sort of (version) numbers within textfromman sort说。

然后传递awk定义-F'v'并根据文件名的第一个重复部分添加到数组(这确保最后一个保留在数组中),因此我所说的命令如下所示,以产生具有大v号的文件

awk -F'v' '{U[$1]=$1"v"$2}END{for(x in U)print U[x]}' <(find . -type f|sort -V)
./012345v3.txt
./3333v7.txt
./11111v11.txt

现在您已获得应保留并删除其余文件的文件列表。

相关内容