Digitalização recursiva para mover todos os arquivos e excluir diretórios vazios

1

Estou aprendendo bash scripting e quero mover todos os arquivos * .ort para um novo diretório e excluir o diretório assim que o arquivo .ort for movido.

Para anotar:

  1. Eu não preciso manter a mesma estrutura - eu quero mudar para um único diretório que contém todos os arquivos .ort
  2. Eu posso excluir o diretório quando o arquivo for movido, pois ele contém apenas um arquivo .ort e nada mais

Acho que isso funcionará, mas queria confirmar antes de executar o script bash em um diretório.

Sintaxe:

find / -iname "*.ort" -type d -exec /bin/mv {} /home/user123/Desktop/movedfiles/ \;
rmdir **/*/;

Congratulo-me com todas as sugestões e feedback para melhorias ou se isso vai funcionar:)

    
por Habib Inman 11.05.2016 / 16:37

1 resposta

0

Você pode fazer:

find . -type f -name '*.ort' -exec mv -i {} outdir \; -exec bash -c 'rmdir "${1%/*}"' _ {} \;
  • find . -type f -name '*.ort' -exec mv -i {} outdir \; moverá o único arquivo .ort do diretório de origem para o diretório de destino ( outdir )

  • A segunda -exec action, -exec bash -c 'rmdir "${1%/*}"' _ {} \; será executada somente se a ação anterior -exec for bem-sucedida, ou seja, .ort arquivo for encontrado e movido com êxito. Você pode colocá-lo em um -exec também com && , mas dois -exec s são usados para tornar as coisas um pouco mais limpas.

  • A segunda ação -exec apenas removerá o diretório vazio que contém o arquivo; ${1%/*} é o padrão de expansão do parâmetro bash para obter o nome do diretório, dirname também funcionaria.

Exemplo:

$ tree
.
├── egg
├── ortdir1
│   └── foo.ort
├── ortdir2
│   └── bar.ort
├── outdir
└── spam

$ find . -type f -name '*.ort' -exec mv -i {} outdir \; -exec bash -c 'rmdir "${1%/*}"' _ {} \;

$ tree
.
├── egg
├── outdir
│   ├── bar.ort
│   └── foo.ort
└── spam
    
por heemayl 11.05.2016 / 17:00