Tengo un directorio de archivos con nombres similares, pero con dígitos incrementales como sufijo. Quiero eliminar los archivos con el sufijo inferior y conservar solo los archivos con el sufijo más alto. A continuación se muestra una lista de archivos de ejemplo:
1k_02.txt
1k_03.txt
1l_02.txt
1l_03.txt
1l_04.txt
2a_05.txt
2a_06.txt
4c_03.txt
4c_04.txt
La lista anterior debe reducirse a los archivos siguientes:
1k_03.txt
1l_04.txt
2a_06.txt
4c_04.txt
Ni siquiera sé por dónde empezar con esto, pero si es posible me gustaría un único comando bash.
Respuesta1
Complejotubería:
Lista de archivos:
$ ls
1l_04.txt 2a_05.txt 4c_03.txt 1k_03.txt 1l_02.txt 4c_04.txt 2a_06.txt 1l_03.txt 1k_02.txt
printf "%s\n" * | sort -t'_' -k1,1 -k2nr | awk -F'_' 'a[$1]++' | xargs rm
Resultados:
$ printf "%s\n" *
1k_03.txt
1l_04.txt
2a_06.txt
4c_04.txt
Respuesta2
Con zsh
:
$ ls
1k_02.txt 1l_02.txt 1l_04.txt 2a_06.txt 4c_04.txt
1k_03.txt 1l_03.txt 2a_05.txt 4c_03.txt
$ (typeset -A seen; for f (*_*(nOn)) let 'seen[${f%_*}]++' && rm -- $f)
$ ls
1k_03.txt 1l_04.txt 2a_06.txt 4c_04.txt
(ver¿Cómo utilizar matrices asociativas de forma segura dentro de expresiones aritméticas?por qué estamos usando let
en lugar de ((...))
aquí).