Как сжать несколько файлов с похожими именами?

Итак, у меня есть около 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 и окна.

обновление

Сайрус дал мне идеальный ответ, проблема в том, что мой вопрос был недостаточно точным:) теперь, когда я умнее, вот следующий набор проблем, которые я еще не понял, как обойти:

так что все работает отлично, если это не происходит:

file_123(abc).foo
file_123456789(b9).foo

эти двое не должны быть сгруппированы, т. е. они должны оказаться в двух отдельных файлах:

file_123.7z
file_123456789.7z

этот one:

for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx*; done

создает эти два по отдельности,но короткий файл работает как универсальный, т. е. file_123.7z включает оба файла, что не должно.

24
задан cYrus
24.03.2023 3:57 Количество просмотров материала 3348
Распечатать страницу

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'
2
отвечен cYrus 2023-03-25 11:45

хорошо, вместо того, чтобы просто дать вам сценарий оболочки, я собираюсь показать вам 7zips контекстное меню.

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

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

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

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

где PARENT_DIRECTORY-имя папки эти файлы. Так что если папку вы в называется, 'файлы', он будет добавить их в файлы.7z'

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

0
отвечен Stonestorm 2023-03-25 14:02

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

7-zip
archiving
batch
script
zip
Вверх