Pode não ser bonito e não estou a lidar com nomes de ficheiros com novas linhas:
find collect/ -mindepth 1 |
awk -F_ '{print $(NF-1),$NF,$0}' |
sort -V |
sed -r 's/^([^ ]* ){2}//'
Então:
- Listando os arquivos com
find
- Adicionando os últimos 2
_
-delimited campos no nome do arquivo ao início dele usandoawk
- Classificando-o (
-V
- classificação de versão - pode manipular campos como0A
e1
) - Removendo a parte adicionada com
sed
Poderia ser seguro para nomes de arquivos contendo qualquer caractere válido, mas eu teria que substituir awk
por sed
para isso.
Minha saída:
$ find collect/ -mindepth 1 | awk -F_ '{print $(NF-1),$NF,$0}' | sort -V | sed -r 's/^([^ ]* ){2}//'
collect/mydir_20161102_0A
collect/mydir_20161102_0B
collect/mydir_20161102_0C
collect/mydir_20161102_1
collect/mydir_20161102_2
collect/other_dir_20161103_0A
collect/other_dir_20161103_0B
collect/mydir_20161104_0A
collect/mydir_20161104_0B
collect/mydir_20161104_0C
collect/mydir_20161104_1
collect/mydir_20161104_2
Claro, isso é apenas analisar ls
. ;)
Se você precisar apenas do título e do timestamp sem o sufixo, inverta a classificação ( sort -Vr
) e modifique o último sed
para:
sed -r 's:.*/::;s/_[^_]*$//;q'
Então:
$ find collect/ -mindepth 1 | awk -F_ '{print $(NF-1),$NF,$0}' | sort -rV | sed -r 's:.*/::;s/_[^_]*$//;q'
mydir_20161104
E uma versão que pode manipular nomes de arquivos com novas linhas:
find collect/ -mindepth 1 -print0 | sed -rz 's/(.*)(_[^_]*)(_[^_]*)$/ &/' | sort -zrV | sed -zr 's:.*/::;s/_[^_]*$//;q'
Isso usa as linhas
-delimited por todo o texto ( -print0
find
in -z
, sed
in sort
e awk
). sed
é substituído por um comando %code% equivalente.