このディレクトリには、/home/Scrivania/pdb_files
同じファイル名形式のXXX_?.pdb
。
例えば、
A4R_A.pdb
A4R_B.pdb
A4R_C.pdb
TY6_A.pdb
001_A.pdb
001_B.pdb
ATE_B.pdb
これらのファイルのいくつかを保持し、他のファイルを削除するだけです。特に、名前の最初の3文字が同じファイルが複数ある場合は、最後の文字 ""に関係なく1つだけを保持したいと思います?
。
したがって、最終的に私のディレクトリには次のファイルのみが必要です。
A4R_A.pdb
TY6_A.pdb
001_A.pdb
ATE_B.pdb
次のエントリを削除してください:A4R_B.pdb
、、、A4R_C.pdb
001_B.pdb
A
最初の3つの同じ文字を持つファイル(、B
または)を保持することは重要ではありませんC
。また、?
文字が文字以外の数字であるか、A、B、Cとは異なる文字である可能性があります。
したがって、選択は最初の3文字のみに基づいて行う必要があります。たとえば、最初の3文字が同じより多くのファイルの場合、1つの戦略は、最初の接点ファイルのみを維持することです。
誰でもこれを行うことができるbashスクリプトを提案できますか?
答え1
この試み、
for dup in $(ls *.pdb | awk 'BEGIN{FS="_"}{if (++dup[$1] >= 2) print}')
do
rm -f $dup;
done
FS="_"
下線をフィールド区切り記号として保持します。(++dup[$1] >= 2)
カウンタが2以上の場合は、ファイル名全体が印刷され、その入力のみがループに渡され、for
ファイルが削除されます。
答え2
そのディレクトリに変更した後、これを行うことができます。最初の3文字が表示されるたびに、最初のアルファベット順のファイルが保持されます。
printf "%s\n" ???_?.pdb | awk -F_ 'seen[$1]++' | xargs echo rm --
echo
テスト後に削除してください。上記のawk
コマンドは、最初の3文字が前の文字と同じファイル名のみをフィルタリングして削除を許可します。