Por que não pode unrar expandir esta expressão?

1

Eu tinha três arquivos RAR no mesmo diretório: file1.rar , file2.rar e file3.rar . Eu queria extraí-los com um comando usando expansão, tendo em mente que os asteriscos têm que ser escapados nos argumentos para unrar , unzip , 7z , etc.

Eu tentei este comando:

unrar x file\*rar

Isso resultou em:

UNRAR 5.00 beta 8 freeware      Copyright (c) 1993-2013 Alexander Roshal

No files to extract

No entanto, este comando funcionou:

unrar x file\*

E este comando funciona:

ls file*rar

Isso resulta em:

file1.rar file2.rar file3.rar

Então, por que o primeiro comando não funciona?

    
por EmmaV 13.05.2015 / 21:34

3 respostas

2

Também não funciona na versão 5.2.7 (versão mais recente). Eu sugiro tentar unrar x file\*.rar , observe o ponto antes de rar . Isso desce um caminho de código ligeiramente diferente, pelo menos em 5.2.7, e funciona em 5.2.7.

Por quê? Bem, depois de alguns minutos olhando a fonte do unrar (dê uma olhada em match.cpp se você quiser tentar!), Eu posso dizer confortavelmente "porque Alexander Roshal realmente, realmente, reallly deveria ter usado glob(3) em vez disso ". Por que ele não? Provavelmente porque não está disponível no Windows, onde o AFAIK rar se origina.

Em extensões do Windows são especiais, e parece que o código unrar o trata como uma espécie de parte não-real do nome do arquivo - um * simples e final corresponderá a um, mas um * em o meio não vai. Não tenho certeza se isso é um comportamento esperado no Windows, mas certamente não no Unix.

Solução alternativa

A maneira sã de lidar com o quebrantamento é provavelmente algo como:

for f in file*rar; do
    unrar x "$f"
done

Deixe o shell expandir o glob e dar ao unrar um arquivo de cada vez. Apenas espere que nenhum dos seus arquivos tenha * em seus nomes ...

Eu disse inicialmente que funcionava no 5.2.7, que estava errado: eu perdi a barra invertida enquanto testava…

    
por 13.05.2015 / 22:11
2
unrar x '*.rar' 

isso funciona para mim, eu tive o mesmo problema.

se omitir, o 'unrar tentará adicionar todos os arquivos na mesma linha de comando

ex: eu tenho 1.rar 2.rar 3.rar se eu fizer

unrar x *.rar

o comando passa para o linux será

unrar x 1.rar  2.rar 3.rar 

e resultar em um erro mas se eu usar o 'assim

unrar x '*.rar' 

o comando passado será

unrar x 1.rar
unrar x 2.rar
.......
    
por 13.03.2016 / 13:31
1

Quando você insere unrar x file\*rar , o programa unrar recebe o string literal file*rar . É provavelmente mais fácil digitar unrar x file*rar , o que fará com que seu shell expanda o padrão ( unrar receberá a lista de arquivos que correspondem ao padrão).

Agora, por que unrar x file\*rar não funciona enquanto, por exemplo, unrar x file\*.rar faz? Meu palpite seria que unrar inclui seu próprio código fazer expansão de padrões, rodar em sistemas onde o shell não faz e as regras não são as mesmas que no Unix. Se eu me lembro corretamente, isso corresponderia às regras do MS-DOS, em que *rar será não correspondem a arquivos com nomes que terminam em .rar .

    
por 13.05.2015 / 22:09

Tags