Shell

zsh globbing - 查找具有重複文件名字元串的文件

  • November 9, 2020

我有一個文件目錄,其文件名格式為<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 textman 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

現在你得到了你應該保留和刪除的文件列表。

引用自:https://unix.stackexchange.com/questions/386958