Recursivamente Extraia todos os 7z

1

Tenho muitos arquivos 7z aninhados em várias subpastas e quero extrair todos esses arquivos nas pastas em que eles residem e, em seguida, excluir os arquivos originais.

Eu encontrei como fazer isso, enquanto extrai para o diretório raiz.

while [ "'find . -type f -name '*.7z' | wc -l'" -gt 0 ]; do find -type f -name "*.7z" -exec 7za x -- '{}' \; -exec rm -- '{}' \;; done

No entanto, todos os arquivos são descompactados para o diretório no qual realizei o comando - quero extrair os arquivos para os locais originais que preservam a estrutura original, mas não tenho certeza de como alterá-lo para fazer isso.

    
por KhaosDvorak 26.05.2015 / 11:05

1 resposta

4

Use -execdir em vez de -exec ;

find . -type f -name "*.7z" -execdir 7za x {} \; -exec rm -- {} \;

-execdir é executado no diretório que contém o arquivo. De man find :

-execdir command {} +
      Like   -exec,   but  the  specified  command  is  run  from  the
      subdirectory containing the matched file, which is not  normally
      the  directory  in  which  you  started  find. 

Outros comentários:

Use -quit no while do find , para que find não continue pesquisando depois que uma correspondência foi encontrada (consulte link ):

while [ -n "$(find . -type f -name '*.7z' -print -quit)" ]
do 
    find . -type f -name "*.7z" -execdir 7za x {} \; -exec rm -- {} \;
done
    
por muru 26.05.2015 / 11:13