形式のファイル名を持つファイルディレクトリがあります<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
コマンドの組み合わせを使用して、最初に見つかったファイルをソートしました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
これで、アーカイブするファイルのリストと残りのファイルを削除する必要があります。