Criando um arquivo RAR ordenado recursivamente

2

Por várias razões, decidi usar o arquivo RAR para armazenar alguns dados, em vez disso, o tar compactado.

Feliz com a decisão, exceto por uma coisa: não consigo encontrar uma maneira de armazenar arquivos classificados. A ordem dos arquivos é importante, já que planejo consultar o arquivo e os resultados devem ser solicitados.
Minha estrutura de arquivos é assim:

2000/
  001.txt
  002.txt
  ...
2001/
  ...
2002/
...
2011/

assim pastas representam anos e arquivos dentro são numerados. Usando ls , tar ou qualquer programa lista arquivos conforme o esperado. Se eu tentar criar rar archive não recursivo (ou seja, compactar arquivos apenas na pasta 2000), os arquivos serão armazenados classificados, mas se eu tentar adicionar arquivos recursivamente ( rar a -r ), os arquivos ficarão confusos.

Não consigo encontrar nenhum switch, exceto:

n@            Read file names to include from stdin

com o qual eu não tive sorte para torná-lo utilizável.

Eu poderia chamar rar em todos os arquivos, como:

for f in */*.txt ; do rar a -r archive.rar $f ; done

mas isso não é muito inteligente.

Alguma idéia?

Como comentei a resposta abaixo, resolvi atualizar a questão:

Consegui armazenar arquivos classificados da mesma forma que na linha não tão inteligente:

for d in */ ; do rar a -r archive.rar $d*.txt ; done

que funciona bem para um cenário específico acima, é claro

Ainda não encontrei como usar a opção n@ . Eu uso RAR 4.10 beta 5

    
por zetah 30.03.2012 / 06:14

4 respostas

1

Usando o rar no Ubuntu

(RAR 3,90 beta 2 Copyright (c) 1993-2009 Alexander Roshal 3 de junho de 2009)

o melhor que você pode fazer é isto:

find * -type f | sort | xargs rar a ../eliezer.rar

Que você descompacta com:

unrar x eliezer.rar

Pelo menos isso não chama o rar para cada arquivo.

A opção -n @ parece funcionar apenas para arquivos. Por exemplo:

find * -type f | rar a ../eliezer.rar -n@

produz "AVISO: Nenhum arquivo" se não houver arquivos regulares no CWD, mas

find * -type d | rar a ../eliezer.rar -n@ -r

funciona para os diretórios.

A chave recursiva rar -r lê os nomes dos arquivos na ordem em que aparecem na struct dirent (man readdir). Então a única maneira que você poderia mudar a ordem que rar empacota os arquivos seria manipular a ordem dos arquivos nas estruturas de arquivos do diretório (geralmente a ordem de criação) antes de chamar rar. Você poderia fazer isso com um editor de diretório, com a ressalva de que alguns tipos de sistema de arquivos podem alterar a ordem dos arquivos na estrutura de diretórios como parte de sua coleta de lixo ou otimização.

    
por 31.03.2012 / 22:37
0

Você realmente se importa como o rar "armazena" os dados?
Não unrar v archive.rar |sort fornecerá uma lista corretamente classificada?

    
por 31.03.2012 / 13:36
0

Eu tive um problema semelhante ao indicado na pergunta e encontrei esta solução:

for d in *; do find "${d}/" -type f | sort | rar a "${d}.rar" @; done
  1. lista todos os diretórios (somente dirs nessa pasta!)
  2. lista todos os arquivos em um dos diretórios
  3. classificar
  4. use o @ sem nada de pecado
por 23.02.2016 / 03:27
0

Informações sobre isso parecem muito escassas. No entanto, esta questão ainda me ajudou a descobrir como fazê-lo. Então, postarei o processo aqui para futuros pesquisadores.

De acordo com: link

RAR command line syntax:
RAR <command>  [ -<switches> ]  <archive>  [ <@listfiles…> ]
[ <files…> ]  [ <path_to_extract\> ]

Listfiles are plain text files that contain names of files to process.
File names should start at the first column. It is possible to
put comments to the listfile after // characters. For example,
you may create backup.lst containing the following strings:

c:\work\doc\*.txt         //backup text documents
c:\work\image\*.bmp       //backup pictures
c:\work\misc

and then run:

rar a backup @backup.lst

If you wish to read file names from stdin (standard input),
specify the empty listfile name (just @).

Win32 console RAR uses OEM (DOS) encoding in list files.

You may specify both usual file names and list files in the same
command line. If neither files nor listfiles are specified,
then *.* is implied and RAR will process all files

Então, o processo seria:

  1. Altere para a raiz da localização da qual você deseja arquivar ou usar caminhos absolutos. Mas esteja ciente de que um caminho absoluto acabará em o arquivo também.
  2. E, em seguida, crie o arquivo de listagem

    find topFolderOfTarget -type f | sort > listFile.txt

  3. Em seguida, execute o rar com @ listfile.txt

    rar a archiveName @listFile.txt

Como alternativa, você pode ignorar a criação de um arquivo de lista:

find topFolderOfTarget -type f | sort | rar a archiveName @

A razão pela qual isso foi útil para mim é que eu estava criando um arquivo multiparte e fazendo o upload para um backup. Se eu quiser apenas um arquivo ou pasta ou 2, posso simplesmente obter as partes relevantes e evitar o download da coisa toda. Confiante de que o conteúdo será devidamente agrupado.

    
por 28.02.2018 / 19:54