zsh globbing - 重複したファイル名文字列を含むファイルを検索する

zsh globbing - 重複したファイル名文字列を含むファイルを検索する

形式のファイル名を持つファイルディレクトリがあります<num1>v<num2>.txt。重複したファイルをすべて探したいです<num1>。重複したアイテムが見つかった場合は、より小さいアイテムを削除する必要があります<num2>

可能ですか?これを処理するためにPythonスクリプトを簡単に書くことができますが、組み込みのzsh機能に最適なアプリケーションになると思いました。

はい

次のファイルのリストでは、最初の3つのファイルに重複した<num1>部分があります。同様に、4番目と5番目も重複します。

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*}:Standard / ksh貪欲モードが最後から削除されました。
  • ${files:|keep}:配列減算。

答え2

私はシェルに慣れていませんzsh。次のawkコマンドの組み合わせを使用して、最初に見つかったファイルをソートしましたfindsortnatural 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

これで、アーカイブするファイルのリストと残りのファイルを削除する必要があります。

関連情報