![zsh globbing - 查找具有重复文件名字符串的文件](https://linux22.com/image/116433/zsh%20globbing%20-%20%E6%9F%A5%E6%89%BE%E5%85%B7%E6%9C%89%E9%87%8D%E5%A4%8D%E6%96%87%E4%BB%B6%E5%90%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个文件名格式为 的文件目录<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
命令组合 和find
来sort
对首先找到的文件进行排序natural sort of (version) numbers within text
fromman 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
现在您已获得应保留并删除其余文件的文件列表。