Se a saída do seu comando find for salva em um arquivo chamado filelist
, tente:
$ awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++' filelist
/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat
Se você quiser fazer a mesma coisa sem criar o arquivo:
find /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*" | awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++'
Ou você prefere distribuir o comando por várias linhas, use:
find /path/to/first_directory/* /path/to/second_directory/* \
/path/to/third_directory/* -mtime -1 -name "filename_pattern*" |
awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++'
onde adicionamos \
ao final da primeira linha porque são os caracteres de continuação de linha do bash. Como a segunda linha termina com |
, ela não exige um caractere de continuação de linha.
Como funciona
Primeiro, é importante que os diretórios sejam listados no comando find
em sua ordem de prioridade. Eu vejo que você já fez isso.
-
-F/
Isso informa ao awk para usar
/
como o separador de campo. Isso significa que o nome do arquivo será o último campo,$NF
. -
f=$NF; sub(/\.Z$/,"",f)
Isso atribui o nome do arquivo à variável
f
e, em seguida, remove o% final.Z
def
, se houver. -
!a[f]++'
Se
f
não foi visto antes, imprima esta linha.
Atualização 1: remoção de outras extensões
De acordo com os comentários, .Z
não é a única extensão que precisa ser removida.
Pode haver outras extensões .dat.edi
e .dat.bak
que devem ser substituídas simplesmente por .dat
. Nesse caso:
awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist
Atualização 2: exibindo arquivos classificados por timestamp:
awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist | xargs -d'\n' -r ls -t