因此,我有大约 20,000 个文件想要按照以下逻辑进行压缩和分组:
- 压缩每个具有相同字符的文件
(
- 还包括没有的文件
(
所以文件就像
file_123.foo
file_123(abc).foo
file_123(b9)(ca)[a1].foo
foobar(a).foo
foobar.foo
foobar(123).foo
压缩后为
file_123.7z
foobar.7z
我接受 Windows 批处理文件、Unix 脚本或任何压缩程序(我可以从那里工作),但最方便的组合是 .7z 和 Windows。
更新
cYrus 给了我一个完美的答案,问题是我的问题不够精确:) 现在我更聪明了,下面是下一组我还没想出如何解决的问题:
所以一切都很顺利,除非发生以下情况:
file_123(abc).foo
file_123456789(b9).foo
这两个不应该被分组,即,它们应该放在两个单独的文件中:
file_123.7z
file_123456789.7z
这个:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx*; done
分别创建这两个,但较短的文件起到了捕获所有文件的作用,即file_123.7z
包含两个文件,但事实并非如此。
答案1
Linux
这应该有效:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx[.\(]*; done
解释
首先我们必须遍历所有输入文件(*.foo
)并去掉后缀(${i%%[.(]*}
)得到:
file_123
file_123
file_123
foobar
foobar
foobar
然后我们可以使用以下方法删除重复项sort -u
:
file_123
foobar
最后,对于每个前缀 ( $pfx
),我们可以使用前缀本身作为档案名称 ( "$pfx.7z"
) 和识别文件的模式 ( $pfx[.\(]*
) 来构建档案;获得相当于:
7z a file_123.7z 'file_123(abc).foo' 'file_123(b9)(ca)[a1].foo' 'file_123.foo'
7z a foobar.7z 'foobar(123).foo' 'foobar(a).foo' 'foobar.foo'
答案2
好的,我不会只给你一个 shell 脚本,而是要向你展示 7zips 上下文菜单。
步骤1:打开包含所有这些文件的文件夹。
第2步:单击“名称”可按名称对所有文件进行排序(这将使选择具有相似名称开头的文件变得容易)。
步骤3:随着正确的鼠标按钮,将选择框拖放到您想要压缩到单个文件中的所有文件上(因此,foobar(a).foo, foobar.foo ,foobar(123).foo)
步骤4:当您松开鼠标右键时,将出现上下文菜单。转到 7Zip > 添加到 PARENT_DIRECTORY.7z
其中 PARENT_DIRECTORY 是这些文件所在文件夹的名称。因此,如果您所在的文件夹名为“files”,它会将它们添加到“files.7z”
步骤5:右键单击新的 7Zip 文件并单击“重命名”来重命名这个新的压缩文件。