Linux

Linux

因此,我有大约 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 文件并单击“重命名”来重命名这个新的压缩文件。

相关内容