Crear un archivo RAR ordenado recursivamente

Crear un archivo RAR ordenado recursivamente

Por varias razones decidí usar un archivo RAR para almacenar algunos datos, en lugar de un tar comprimido.

Contento con la decisión, excepto por una cosa: no encuentro una manera de almacenar los archivos ordenados. El orden de los archivos es importante ya que planeo consultar el archivo y los resultados deben estar ordenados.
Mi estructura de archivos es así:

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

por lo que las carpetas representan años y los archivos que contienen están numerados. Usando ls, taro cualquier programa enumera los archivos como se esperaba. Si intento crear rarun archivo no recursivo (es decir, comprimir archivos sólo en la carpeta 2000), los archivos se almacenan ordenados, pero si intento agregar archivos de forma recursiva ( rar a -r), los archivos se estropean.

No puedo encontrar ningún interruptor excepto:

n@            Read file names to include from stdin

con lo cual no tuve suerte de hacerlo utilizable.

Podría llamar rara cada archivo como:

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

pero eso no es muy inteligente.

¿Algunas ideas?


Como comenté a continuación, pensé en actualizar la pregunta:

Logré almacenar archivos ordenados de manera similar a la línea anterior, no tan inteligente:

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

que funciona bien para el escenario particular anterior, por supuesto

n@Aún no he encontrado cómo usar el interruptor. yo sueloRAR 4.10 beta 5

Respuesta1

Usando rar en Ubuntu

(RAR 3.90 beta 2 Copyright (c) 1993-2009 Alexander Roshal 3 de junio de 2009)

lo mejor que puedes hacer es esto:

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

Con el que desempacas:

unrar x eliezer.rar

Al menos esto no llama a rar para todos los archivos.

El modificador -n@ parece funcionar sólo para archivos. Por ejemplo:

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

produce "ADVERTENCIA: No hay archivos" si no hay archivos normales en el CWD, pero

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

Funciona para los directorios.

El modificador recursivo rar -r lee los nombres de los archivos en el orden en que aparecen en la estructura directa (man readdir). Entonces, la única forma de cambiar el orden en que rar empaqueta los archivos sería manipular el orden de los archivos en las estructuras de archivos del directorio (generalmente el orden de creación) antes de llamar a rar. Puede hacer esto con un editor de directorios, con la advertencia de que algunos tipos de sistemas de archivos pueden cambiar el orden de los archivos en la estructura de directorios como parte de su recolección de basura u optimización.

Respuesta2

¿Realmente te importa cómo rar "almacena" los datos?
¿No unrar v archive.rar |sortte daría una lista correctamente ordenada?

Respuesta3

Tuve un problema similar al indicado en la pregunta y se me ocurrió esta solución:

for d in *; do find "${d}/" -type f | sort | rar a "${d}.rar" @; done
  1. enumera todos los directorios (¡solo directorios en esa carpeta!)
  2. enumerar todos los archivos en uno de los directorios
  3. clasificar
  4. usa la @ sin nada de pecado

Respuesta4

La información al respecto parece muy escasa. Sin embargo, esta pregunta todavía me ayudó a descubrir cómo hacerlo. Así que publicaré el proceso aquí para futuros buscadores.

De acuerdo a: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

Entonces el proceso sería:

  1. Cambie a la raíz de la ubicación desde la que desea archivar o utilice rutas absolutas. Pero tenga en cuenta que una ruta absoluta también terminará en el archivo.
  2. Y luego crea el archivo de lista.

    find topFolderOfTarget -type f | sort > listFile.txt

  3. Luego ejecuta rar con @listfile.txt

    rar a archiveName @listFile.txt

Alternativamente, puedes omitir la creación de un archivo de lista:

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

La razón por la que esto me resultó útil es que estaba creando un archivo de varias partes y subiéndolo para realizar una copia de seguridad. Si solo quiero un archivo o carpeta o dos, simplemente puedo obtener las partes relevantes y evitar descargar todo. Confiado en que los contenidos quedarán correctamente agrupados.

información relacionada