Eu quero classificar esta saída única do comando find sem nomes de arquivos duplicados em qualquer diretório.
find /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*"
saída de exemplo:
/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/first_directory/archive/sample_file1_2017Dec25.dat.Z
/path/to/first_directory/archive/sample_file2_2017Nov01.dat.Z
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file1_2017Dec25.dat
/path/to/third_directory/sample_file2_2017Nov01.dat
/path/to/third_directory/sample_file3_2017Oct08.dat
/path/to/third_directory/sample_file4_2017Sep11.dat
/path/to/third_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
Na saída, você pode ver que há nomes de arquivos duplicados em /first_directory/
e /first_directory/archive/
também todos os arquivos de /first_directory/*
e /second_directory/*
também estão dentro de /third_directory/*
. Isso significa que /third_directory/*
é o diretório de arquivo de todos os arquivos encontrados em /first_directory/*
e /second_directory/*
, mas também há arquivos que só podem ser encontrados em /third_directory/*
( verifique sample_file6
e sample_file7
)
Tudo o que quero imprimir são os arquivos originários de para para /first_directory/
nesta /first_directory/archive/
ordem sem duplicação e também classificados por data./second_directory/
/third_directory/
Saída desejada:
/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 a saída do seu comando find for salva em um arquivo chamado
filelist
, tente:Se você quiser fazer a mesma coisa sem criar o arquivo:
Ou, se preferir espalhar o comando em várias linhas, use:
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 requer um caractere de continuação de linha.Como funciona
Primeiro, é importante que os diretórios sejam listados no
find
comando em sua ordem de prioridade. Vejo que você já fez isso.-F/
Isso diz ao awk para usar
/
como 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
,f
se presente.!a[f]++'
Se
f
não foi visto antes, imprima esta linha.Atualização 1: removendo 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 elas.dat.bak
devem ser substituídas simplesmente por.dat
. Nesse caso:Atualização 2: Exibindo arquivos classificados por carimbo de data/hora: