Renomeando vários diretórios

2

Se tiver uma estrutura de diretórios que armazene registros com base em sua data de gravação. Originalmente, havia um diretório que continha um subdiretório para cada dia como este

  • basedir
    • 2010-01-01
      • vários arquivos e, às vezes, subdiretórios
    • 2010-01-02
    • ...
    • ...
    • 2014-12-15

Desde que isso se tornou muito grande para o conforto, eu decidi fazer algumas mudanças e acabei com isso:

  • basedir
    • 2010
      • 01
        • 2010-01-01
        • 2010-01-02
        • ...
        • 2010-01-31
      • 02
        • 2010-02-01
        • 2010-02-02
        • ...
        • 2010-02-28
      • 03
      • ...
    • 2011
    • ...
    • 2014

Então, para chegar aos dados de hoje, eu procuraria em basedir/2014/12/2014-12-15/

Gostaria de renomear todos os subdiretórios de data completa, de forma que eles tenham apenas o dia do mês como nome. Os dados de hoje seriam então localizados em basedir/2014/12/15/ .

Qual é o caminho mais fácil para conseguir isso?

Depois de dar uma olhada, criei um find regex que especificamente me fornece os diretórios que estou procurando, reduzindo, assim, a alteração de atrapalhar as coisas.

find . -type d -regextype posix-extended -regex '.*/(20[0-9]{2})/(0[1-9]|1[0-2])/--(0[1-9]|[1-2][0-9]|3[0-1])'

    
por DeltaLima 15.12.2014 / 13:14

1 resposta

3

Aqui está um verso:

find -mindepth 3 -maxdepth 3 -type d | while read -r name; do
  mv -v "$name" "${name/????-??-}"; done

a ser executado em basedir .

A quebra de linha é apenas para facilitar a leitura, mas tecnicamente é uma linha única.

É altamente recomendável criar um backup antes de executar. Este comando não faz verificações de sanidade. Não é nada seguro executar em árvores arbitrárias. Ele vai bagunçar com dirs que acontecem para ter a mesma parte "data". Ele irá quebrar quando houver espaços nos nomes de diretório.

Mas, para uma execução única, em dados em que você sabe que os nomes dos arquivos são são, com backup e verificação manual depois, é seguro usá-lo uma vez.

A parte "${name/????-??-}" é bash específica. Pode não funcionar em outros shells. É chamado de pesquisa e substituição na expansão de parâmetros .

    
por 15.12.2014 / 13:58

Tags