由于各种原因我决定使用 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
在 Ubuntu 上使用 rar
(RAR 3.90 beta 2 版权所有 (c) 1993-2009 Alexander Roshal 2009 年 6 月 3 日)
你能做的最好的事情就是:
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
然后使用@listfile.txt运行rar
rar a archiveName @listFile.txt
或者,您可以跳过创建列表文件:
find topFolderOfTarget -type f | sort | rar a archiveName @
这对我有用的原因是我正在创建一个多部分存档并将其上传以进行备份。如果我只想要一个或两个文件或文件夹,那么我可以简单地获取相关部分并避免下载整个内容。确信内容将被正确分组。