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
, tar
ou qualquer programa lista os arquivos conforme o esperado. Se eu tentar criar rar
um 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 rar
todos 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 |sort
lhe 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
- lista todos os diretórios (apenas dirs nessa pasta!)
- liste todos os arquivos em um dos diretórios
- organizar
- 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:
- 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.
E então crie o listfile
find topFolderOfTarget -type f | sort > listFile.txt
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.