2

Итак, у меня есть около 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 включает оба файла, чего не должно быть.

2 ответа2

2

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'
0

Хорошо, вместо того, чтобы просто дать вам скрипт оболочки, я покажу вам контекстное меню 7zips.

Шаг 1: Откройте папку со всеми этими файлами.

Шаг 2: Нажмите "Имя", чтобы упорядочить все файлы по их именам (это облегчит выбор файлов с одинаковыми именами в начале).

Шаг 3: Правой кнопкой мыши перетащите блок выбора над всеми файлами, которые вы хотите сжать в одном файле (т. Е. Foobar (a).foo, foobar.foo, foobar (123).foo)

Шаг 4: Когда вы отпустите правую кнопку мыши, появится контекстное меню. Перейдите к 7Zip> Добавить в PARENT_DIRECTORY.7z

Где PARENT_DIRECTORY - имя папки, в которой находятся эти файлы. Поэтому, если папка, в которой вы находитесь, называется «files», она добавит их в «files.7z».

Шаг 5: Переименуйте этот новый сжатый файл, щелкнув правой кнопкой мыши новый файл 7Zip и нажав «Переименовать».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .