AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 409085
Accepted
WashichawbachaW
WashichawbachaW
Asked: 2017-12-06 19:02:20 +0800 CST2017-12-06 19:02:20 +0800 CST 2017-12-06 19:02:20 +0800 CST

processamento de texto - Como classificar a saída exclusiva de find que possui nomes de arquivos duplicados de diretório diferente?

  • 772

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_file6e 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
text-processing find
  • 1 1 respostas
  • 274 Views

1 respostas

  • Voted
  1. Best Answer
    John1024
    2017-12-06T19:17:31+08:002017-12-06T19:17:31+08:00

    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, se preferir espalhar o comando em 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 requer um caractere de continuação de linha.

    Como funciona

    Primeiro, é importante que os diretórios sejam listados no findcomando em sua ordem de prioridade. Vejo que você já fez isso.

    1. -F/

      Isso diz ao awk para usar /como separador de campo. Isso significa que o nome do arquivo será o último campo, $NF.

    2. f=$NF; sub(/\.Z$/,"",f)

      Isso atribui o nome do arquivo à variável fe, em seguida, remove o final .Z, fse presente.

    3. !a[f]++'

      Se fnão foi visto antes, imprima esta linha.

    Atualização 1: removendo outras extensões

    De acordo com os comentários, .Znão é a única extensão que precisa ser removida. Pode haver outras extensões .dat.edie elas .dat.bakdevem 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 carimbo de data/hora:

    awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist | xargs -d'\n' -r ls -t
    
    • 1

relate perguntas

  • GNU find: obtenha caminho absoluto e relativo em -exec

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve