Remover arquivos de determinado tipo, reter a árvore de diretórios

3

Estou tentando mover vários arquivos .doc e .xls, que estão armazenados em várias pastas e subpastas, para um novo local. Eu tentei anteriormente o cp -r **/{*.doc,*.xls} /wherever/you/want/ , que funcionou, exceto que ele não mantinha a árvore de diretórios mais rápida.

Pergunta: Existe um comando / conjunto de comandos para limpar todos os arquivos, exceto .doc e .xls, em uma pasta e suas subpastas, mas ainda reter a estrutura da árvore de diretórios? E melhor ainda, existe um comando para remover pastas vazias, então eu não tenho que passar depois e manualmente apagar pastas vazias?

    
por DaimyoKirby 22.11.2012 / 20:10

3 respostas

8

Você pode usar o comando find . Estes comandos devem ser executados a partir de dentro do diretório onde seus arquivos .xls e .doc (e outros diretórios) são mantidos. NÃO execute isto no seu diretório pessoal!

A maneira mais fácil de fazer isso é apagar todos os arquivos não-xls e não-doc (CUIDADO, este comando irá apagar todos os outros arquivos):

find ./ -type f -not -name "*.xls" -and -not -name "*.doc" -exec rm {} \;

Depois, você pode usar isso para encontrar e excluir diretórios vazios. Para evitar o uso de um rm -rf potencialmente muito destrutivo, isso exclui um nível por vez, você pode ter que executá-lo várias vezes para excluir todos os diretórios vazios:

find ./ -type d -empty -exec rmdir {} \;

Veja esta questão para mais detalhes sobre o que encontrar e como usá-lo.

    
por roadmr 22.11.2012 / 20:32
3

Isso deve fazer tudo de uma vez:

find path/to/dir '!' -iname "*.doc" '!' -iname "*.xls" -empty -delete

(exceto que suas pastas têm extensões como .xls ou doc ...)

Substitua -delete por -print para ver o que é excluído primeiro.

    
por phoibos 22.11.2012 / 20:40
2

Isso requer alguma sintaxe rsync bastante sofisticada, mas isso pode ser feito:

rsync -r --filter="+ */" --filter="+ **/*.xls" --filter="+ **/*.doc" --filter="- **" --prune-empty-dirs /path/to/source/ /path/to/target/

Demonstração:

me@banshee:/tmp$ find source
source
source/1.xls
source/1
source/1/2
source/1/2/2.xls
source/1/1.doc
source/lol.crapfile

me@banshee:/tmp$ find target
target

me@banshee:/tmp$ rsync -r --filter="+ */" --filter="+ **/*.xls" --filter="+ **/*.doc" --filter="- **" --prune-empty-dirs source/ target/

me@banshee:/tmp$ find target
target
target/1.xls
target/1
target/1/2
target/1/2/2.xls
target/1/1.doc
    
por Jim Salter 22.11.2012 / 20:46