Создание рекурсивно отсортированного архива RAR

Создание рекурсивно отсортированного архива RAR

По разным причинам я решил использовать архив RAR для хранения некоторых данных, а не сжатый tar.

Доволен решением, за исключением одного: не могу найти способ хранить файлы отсортированными. Порядок файлов важен, так как я планирую запросить архив, и результаты должны быть упорядочены.
Моя структура файлов такая:

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

поэтому папки представляют годы, а файлы внутри пронумерованы. Использование ls, tarили любой программы выводит список файлов, как и ожидалось. Если я пытаюсь создать нерекурсивный rarархив (т. е. сжимать файлы только в папке 2000), файлы сохраняются отсортированными, но если я пытаюсь добавить файлы рекурсивно ( rar a -r), то файлы перепутываются.

Я не могу найти никаких переключателей, кроме:

n@            Read file names to include from stdin

с которым мне не удалось сделать его пригодным для использования.

Я мог бы вызвать rarкаждый файл следующим образом:

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

но это не очень умно.

Есть идеи?


Поскольку я прокомментировал ответ ниже, я подумал обновить вопрос:

Мне удалось сохранить отсортированные файлы аналогично приведенной выше не очень умной строке:

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

что, конечно, отлично работает для конкретного сценария, описанного выше.

Я пока не нашел, как использовать n@switch. Я используюRAR 4.10 beta 5

решение1

Использование rar в Ubuntu

(RAR 3.90 beta 2 Copyright (c) 1993-2009 Александр Рошаль 3 июня 2009)

лучшее, что вы можете сделать, это:

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

Который вы распаковываете с помощью:

unrar x eliezer.rar

По крайней мере, это не вызывает rar для каждого файла.

Ключ -n@, похоже, работает только для файлов. Например:

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

выдает «ПРЕДУПРЕЖДЕНИЕ: Нет файлов», если в CWD нет обычных файлов, но

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

работает для каталогов.

Рекурсивный переключатель rar -r считывает имена файлов в том порядке, в котором они указаны в структуре dirent (man readdir). Таким образом, единственный способ изменить порядок, в котором rar упаковывает файлы, — это изменить порядок файлов в структурах файлов каталога (обычно это порядок создания) перед вызовом rar. Это можно сделать с помощью редактора каталогов, с оговоркой, что некоторые типы файловых систем могут изменять порядок файлов в структуре каталогов в рамках своей сборки мусора или оптимизации.

решение2

Вас действительно волнует, как rar "хранит" данные?
Он не unrar v archive.rar |sortдаст вам правильно отсортированный список?

решение3

У меня была похожая проблема, как указано в вопросе, и я придумал такое решение:

for d in *; do find "${d}/" -type f | sort | rar a "${d}.rar" @; done
  1. он выводит список всех каталогов (только каталоги в этой папке!)
  2. список всех файлов в одном из каталогов
  3. Сортировать
  4. используйте @ без всякого греха

решение4

Информация об этом кажется очень скудной. Однако этот вопрос все же помог мне разобраться, как это сделать. Поэтому я опубликую процесс здесь для будущих поисковиков.

В соответствии с: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

Итак, процесс будет следующим:

  1. Измените на корень расположения, из которого вы хотите архивировать, или используйте абсолютные пути. Но учтите, что абсолютный путь также попадет в архив.
  2. И затем создайте файл списка

    find topFolderOfTarget -type f | sort > listFile.txt

  3. Затем запустите rar с @listfile.txt

    rar a archiveName @listFile.txt

В качестве альтернативы вы можете пропустить создание файла списка:

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

Причина, по которой это было полезно для меня, заключается в том, что я создавал многокомпонентный архив и загружал его для резервного копирования. Если мне нужен только файл или папка или 2, то я могу просто получить соответствующие части и не загружать все. Уверен, что содержимое будет правильно сгруппировано.

Связанный контент