Shell
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
您可以執行以下操作:
files=(<->v<->.txt(n)) typeset -A h for f ($files) h[${f%%v*}]=$f keep=($h) echo rm ${files:|keep}
(
echo
開心就刪)
<->
: 任何數字序列(<x-y>
沒有指定邊界的 glob 運算符)(n)
: 數字排序${f%%v*}
:標準/ksh 貪婪模式從末尾剝離。${files:|keep}
: 數組減法。
我對 shell 不太熟悉,
zsh
我將使用以下awk
命令組合來對首先找到的文件進行排序from說。find``sort``natural sort of (version) numbers within text
man 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
現在你得到了你應該保留和刪除的文件列表。