Линукс

Линукс

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

Линукс

Это должно сработать:

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

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

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

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

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

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

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

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

Связанный контент