Mova apenas um determinado subdiretório para uma nova pasta com shell script

Mova apenas um determinado subdiretório para uma nova pasta com shell script

Eu tenho uma pasta Accountscontendo contas de e-mail, todas essas pastas possuem uma pasta Archive.folder. Quero mover todas as pastas de arquivo com um script simples para uma nova pasta.

Eu tentei isso até agora:

find . -mindepth 1 -maxdepth 1 ! -name archive -exec mv -t testnew/ {} + 

Mas move todas as pastas, não apenas aquelas chamadas arquivo. Quero encontrar todas as pastas na pasta atual chamada archive e movê-las para a pasta testnew/. O caminho para a pasta movida deve ser o mesmo de antes.

Situação existente:

Accounts
    - 1
          - archive
          - inbox
          - folder2
    - 2
          - archive
          - inbox
          - folder2

    - 3
          - archive
          - inbox
          - folder2

Como deveria ser:

testnew
    - 1
          - archive
    - 2
          - archive
    - 3
          - archive

Responder1

Se não houver problema em fazer isso de forma interativa, vidirpode ser uma boa maneira. Veresta resposta.

No seu caso o procedimento será assim:

  1. cd /path/to/Accounts
    find . -type d -name archive | vidir -
    
  2. vidirexecutará um editor de texto. Use "pesquisar e substituir" e substitua cada início ./pelo caminho desejado, para que as linhas correspondam à estrutura de diretórios desejada. Os caminhos podem ser absolutos ou relativos, podem conter ../. Por exemplo, você pode facilmente transformar isso

    ./1/archive
    ./2/archive
    ./3/archive
    

    nisso

    ../testnew/1/archive
    ../testnew/2/archive
    ../testnew/3/archive
    
  3. Salve o arquivo editado e saia do editor.

Notas:

  • Se a sua estrutura de diretórios contém diretórios com nomes que terminam com .(para que ./a substring não apareça apenas no início), será melhor substituí-la <TAB>./por <TAB>whatever/path/you/want/, onde <TAB>indica o caractere de tabulação. Depende do editor se/como você pode incluir esse caractere em "pesquisar e substituir".
  • Escolha seu editor especificando EDITOR, por exemplo find … | EDITOR=kate vidir -.
  • vidirnão é capaz de mover arquivos entre sistemas de arquivos. Se todos archiveos diretórios pertencem a um sistema de arquivos e você deseja testnewestar em outro sistema de arquivos, crie testnewno sistema de arquivos de origem, use vidire finalmente mova testnewpara o sistema de arquivos de destino.
  • No fim deesta outra respostaexiste uma abordagem experimental que (ab)usa EDITORpara tornar vidirnão interativo. No entantoAcho vidirútil em casos como o seu, principalmente porque me permite ter certeza de que os caminhos resultantes são realmente o que desejo antes que ocorra qualquer renomeação/movimentação. Se eu estragar alguma coisa, posso abortar sem salvar as alterações.Se você deseja uma solução não interativa para o seu problema, essa vidirnão é a melhor ferramenta.

informação relacionada