
Итак, у меня есть около 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 и выбрав «Переименовать».