在这个目录中/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
我只需要保留其中一些文件并删除其他文件。特别是,如果我有多个名称前三个字符相同的文件,我只想保留一个,而不管最后一个字符“ ?
”。
所以最后,在我的目录中,我应该只有这些文件:
A4R_A.pdb
TY6_A.pdb
001_A.pdb
ATE_B.pdb
并删除这些:A4R_B.pdb
, A4R_C.pdb
,001_B.pdb
保留哪一个具有前三个相同字符的文件并不重要(A
、B
或C
)。另外,可能还有其他情况,字符“ ?
”不是字母,而是数字,或者可能是与 A、B 或 C 不同的字母。
因此,选择必须完全基于前三个字符。例如,对于具有前三个相同字符的更多文件,一种策略是仅保留您遇到的第一个文件。
有人可以建议一个 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 个字母与前一个字母相同的文件名,因此允许它们通过删除。