Criando arquivo RAR classificado recursivamente

Criando arquivo RAR classificado recursivamente

Por vários motivos, decidi usar o arquivo RAR para armazenar alguns dados, em vez do tar compactado.

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

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

portanto, as pastas representam anos e os arquivos dentro dela são numerados. Usar ls, tarou qualquer programa lista os arquivos conforme o esperado. Se eu tentar criar rarum arquivo 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 nenhuma opção, exceto:

n@            Read file names to include from stdin

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

Eu poderia chamar rartodos os arquivos como:

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

mas isso não é muito inteligente.

Alguma ideia?


Como comentei a resposta abaixo, pensei em atualizar a pergunta:

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

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

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

n@Ainda não descobri como usar o switch. eu usoRAR 4.10 beta 5

Responder1

Usando 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 é isso:

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

Com o qual você descompacta:

unrar x eliezer.rar

Pelo menos isso não chama rar para todos os arquivos.

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 opção recursiva rar -r lê os nomes dos arquivos na ordem em que aparecem na estrutura direta (man readdir). Portanto, a única maneira de alterar a ordem em que o rar compacta os arquivos seria manipular a ordem dos arquivos nas estruturas de arquivos do diretório (geralmente a ordem de criação) antes de chamar o rar. Você poderia fazer isso com um editor de diretório, com a ressalva de que alguns tipos de sistemas de arquivos podem alterar a ordem dos arquivos na estrutura de diretórios como parte de sua coleta de lixo ou otimização.

Responder2

Você realmente se importa com o modo como o rar "armazena" os dados?
Não unrar v archive.rar |sortlhe daria uma lista devidamente ordenada?

Responder3

Eu tive um problema semelhante ao declarado 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 (apenas dirs nessa pasta!)
  2. liste todos os arquivos em um dos diretórios
  3. organizar
  4. use o @ sem nada de pecado

Responder4

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

De acordo com:http://acritum.com/winrar/console-rar-manual

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. Mude para a raiz do local onde você deseja arquivar ou use caminhos absolutos. Mas esteja ciente de que um caminho absoluto também terminará no arquivo.
  2. E então crie o listfile

    find topFolderOfTarget -type f | sort > listFile.txt

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

    rar a archiveName @listFile.txt

Alternativamente, você pode pular 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 multipartes e enviando-o para um backup. Se eu quiser apenas um arquivo ou pasta ou dois, posso simplesmente obter as partes relevantes e evitar o download de tudo. Confiante de que o conteúdo será agrupado adequadamente.

informação relacionada