Como faço para encontrar e listar pastas com um nome de pasta específico, contendo arquivos modificados recentemente?

1

Eu tenho um conjunto de pastas que são atualizadas regularmente, o que eu gostaria de analisar regularmente e atualizar em uma lista de arquivos de texto simples. Esta lista é usada com o rsync, então eu encurto os nomes dos arquivos usando sed para facilitar a sincronização.

Eles são configurados assim:

  • software_folder
    • software_version_1
      • version_1.1
        • some_files
      • version_BETA
        • some_files
    • software_version_2
      • versão_2.2
        • some_files
      • version_BETA
        • some_files

Eu tentei algo como:

for dir in 'find -maxdepth 2 -type d -name '*BETA''; do test 'find $dir -type f -mtime -1' | echo $dir | sed "s|^\./||" >> list.txt; done

Mas a saída ainda está listando todas as pastas BETA (e fornece um erro de 'operando desconhecido' em .aspx arquivos?).

Seria um bônus se o script pudesse passar para a próxima pasta depois de encontrar um mínimo de um arquivo modificado e atualizar a lista de pastas, para não precisar percorrer o restante dos arquivos por pasta. .

    
por neonfrontier 17.06.2016 / 01:16

1 resposta

0

Para localizar todos os diretórios *BETA que possuem novos arquivos neles ( -mtime -1 ) e salvar esses nomes de diretórios em list.txt , tente:

find -type f -path '*BETA/*' -mtime -1 | sed 's|^\./||; s|BETA/.*|BETA|' | sort -u >list.txt

Como seu objetivo é criar dados separados por nova linha no arquivo list.txt , isso significa que você não espera que nenhum dos diretórios ou arquivos tenha nomes que contenham caracteres de nova linha. Se o fizessem, então, é claro, um formato de saída diferente seria necessário.

Como funciona

  • find -type f -path '*BETA/*' -mtime -1

    Isso localiza todos os novos arquivos que têm um diretório pai, em algum lugar no caminho, cujo nome termina em BETA quando novo é definido pelas convenções de find para -mtime -1 .

  • sed 's|^\./||; s|BETA/.*|BETA|'

    Isso remove o ./ inicial dos nomes dos arquivos e também remove tudo após o BETA . O resultado é o nome do diretório BETA.

  • sort -u

    A lista de diretórios que sed cria terá duplicatas. Isso remove as duplicatas.

  • >list.txt

    Isso salva a saída em list.txt

Solução mais geral

A seguinte abordagem é segura mesmo se diretórios ou arquivos tiverem caracteres de nova linha em seus nomes (isso pode exigir ferramentas GNU):

find -type f -path '*BETA/*' -mtime -1 -print0 | sed -z 's|^\./||; s|BETA/.*|BETA|' | sort -zu >list.out

Isso cria um arquivo list.out que tem os nomes de diretório em formato separado por nul. Como o caractere nulo nunca pode aparecer em um nome de arquivo ou diretório, essa é uma abordagem segura. Para usar list.out , você, é claro, precisaria lê-lo com uma ferramenta que entende entradas separadas por nul.

    
por 17.06.2016 / 03:08