unrar'ing tudo em subdiretórios sem entrar em um loop

0

Por isso, tentei unrar vários arquivos .rar em várias pastas diferentes. Alguns são embalados de forma um pouco diferente e o looping está causando um problema.

- folder 1
        - file.part01.rar
        - file.part02.rar
        - ...
- folder 2
        - file.r01
        - file.r02
        - file.rar
- folder 3
        - file1.rar
        - file2.rar
        - ...

depois de fazer for f in *.rar; do unrar e $f;done ou algo similar, ele entra em um loop e mantém arquivos unrar'ing já prontos. Isso ocorre porque part01.rar & part02.rar ambos são arquivos rar e satisfazem o comando.

Existe algo que eu possa fazer para parar esse loop?

Tenho mais de 50 pastas, por isso não quero passar por todas elas individualmente.

    
por csc 06.11.2018 / 16:59

3 respostas

1

Parece que você deseja excluir os arquivos que terminam em partN.rar , em que N é maior que 1. Com zsh :

set -o extendedglob
for file (./**/(^*part<2->).rar(N.)) echo unrar e $file

Remova echo quando estiver satisfeito com o que vai fazer.

Com bash , é um pouco mais complicado:

(export LC_ALL=C; shopt -s extglob globstar nullglob
for file in ./**/!(*part*(0)@([2-9]|[1-9]+([0-9]))).rar; do
  [ -f "$file" ] || continue
  [ -L "$file" ] && continue
  echo unrar e "$file"
done)

Ou com o GNU find :

LC_ALL=C find . -name '*.rar' -type f -regextype egrep \
  ! -regex '.*part0*([2-9]|[1-9][0-9]+)\.rar' \
  -exec echo unrar e {} \;

(aquele também considera arquivos rar ocultos ou arquivos rar em diretórios ocultos).

Ou você pode tentar analisar a saída de unrar l nos arquivos para determinar quais são arquivos de volume único ou o primeiro volume de um arquivo de vários volumes.

Aqui testado com o unrar 5.61 do rarlab.com em arquivos RAR da versão 5 (e supondo que não exista nenhum arquivo com o nome $'whatever\nDetails: whatever.rar' ), com zsh :

is_first_volume() {
  unrar l "${1-$REPLY}" 2>&1 | awk '
    /^Details: / {
       is_rar = /RAR/
       if (/volume/) volume = $NF
       exit
    }
    END {
      if (!is_rar || volume > 1) exit 1
    }'
}

for file (./**/*.rar(N.+is_first_volume)) echo unrar e $file
    
por 06.11.2018 / 19:28
0

Talvez tente:

find . -type f -name '*.rar' -print0 | xargs -0I{} unrar e {}
    
por 06.11.2018 / 17:12
0

Se eu entendi seu problema corretamente, você quer tirar um instantâneo dos arquivos .rar , unrar estes somente e não descompactar nenhum arquivo .rar adicional que esteja dentro do instantâneo original dos arquivos rar .

# put all files currently in the directory in a variable
csc_rarfiles=(*.rar)
# now iterate over the files contained in the array and unrar only those
for f in "${csc_rarfiles[*]}"; do unrar e "$f"; done
    
por 06.11.2018 / 17:15