По разным причинам я решил использовать архив 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
- он выводит список всех каталогов (только каталоги в этой папке!)
- список всех файлов в одном из каталогов
- Сортировать
- используйте @ без всякого греха
решение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
Итак, процесс будет следующим:
- Измените на корень расположения, из которого вы хотите архивировать, или используйте абсолютные пути. Но учтите, что абсолютный путь также попадет в архив.
И затем создайте файл списка
find topFolderOfTarget -type f | sort > listFile.txt
Затем запустите rar с @listfile.txt
rar a archiveName @listFile.txt
В качестве альтернативы вы можете пропустить создание файла списка:
find topFolderOfTarget -type f | sort | rar a archiveName @
Причина, по которой это было полезно для меня, заключается в том, что я создавал многокомпонентный архив и загружал его для резервного копирования. Если мне нужен только файл или папка или 2, то я могу просто получить соответствующие части и не загружать все. Уверен, что содержимое будет правильно сгруппировано.