7zip: Как исключить типы файлов?

Я хочу исключить следующие типы файлов:

  • EPUB
  • PDF
  • HTML (в верхнем регистре тоже)
  • azw3
  • моби
  • БКП
  • текст

У меня есть это до сих пор, который, кажется, не работает, я получаю сообщение об ошибке "Неверная командная строка".

7z e "-x!*.epub" "-x!*.pdf" "-x!*.html" "-x!*.azw3" "-x!*.mobi" "-x!*.txt" "-x!*.HTML" "-x!*.opf" *

Я также попробовал вышеупомянутую команду без двойных кавычек.

Я создал вышеупомянутую команду, используя информацию отсюда (для окон), но она не работает в Linux.

3 ответа

Решение

7z принимает только один архив в своих аргументах, но вы передаете подстановочный знак, который раскрывается до полного содержимого текущего рабочего каталога; Еще одна проблема заключается в том, что подстановочные знаки в аргументах также будут расширяться, если они не заключены в кавычки или заключены в двойные кавычки.

Таким образом, вы должны извлечь только один архив на команду; в конце следует удалить подстановочный знак, указать один архив и заключить в кавычки аргументы:

7z e '-x!*.epub' '-x!*.pdf' '-x!*.html' '-x!*.azw3' '-x!*.mobi' '-x!*.txt' '-x!*.HTML' '-x!*.opf' archive.7z

Однако, чтобы извлечь несколько архивов одновременно, вы можете использовать несколько методов:

  • bash:
for archive in *.7z; do 7z e '-x!*.epub' '-x!*.pdf' '-x!*.html' '-x!*.azw3' '-x!*.mobi' '-x!*.txt' '-x!*.HTML' '-x!*.opf' "$archive"; done
  • find:
find . -maxdepth 1 -type f -iname "*.7z" -exec 7z e '-x!*.epub' '-x!*.pdf' '-x!*.html' '-x!*.azw3' '-x!*.mobi' '-x!*.txt' '-x!*.HTML' '-x!*.opf' {} \;

От man 7z:

-x[r[-|0]]]{@listfile|!wildcard}
              Exclude filenames

Чтобы исключить файл (или типы), вы можете использовать следующую команду:

7z a -xr@exclude.txt backup.7z /whatever/dirs/or/files

уведомление -xr вместо -x, r указывает на рекурсию, чтобы он мог соответствовать исключенным файлам в глубоких иерархиях папок

Файл exclude.txt это список, разделенный возвратом каретки, например:

*.epub
*.pdf
*.html 
*.HTML
*.azw3
*.mobi
*.opf
*.txt

Возможно, извлечение из нескольких архивов было невозможно во время вопроса.

По состоянию на 2020 год 7z можно извлекать из нескольких архивов, но их нужно указать специальным флагом:

       -ai[r[-|0]]{@listfile|!wildcard}
              Include archives

документы

Обратите внимание, что когда вы используете это, вам больше не нужно указывать archive_name в командной строке (где вы пропустили *), поэтому вам нужно отключить его с помощью-an флаг.

Остальные флаги работают так, как вы их поставили, за исключением кавычек: они необходимы, чтобы избежать интерпретации ! а также *вашей оболочкой. В bash двойные кавычки ("..") по-прежнему допускают расширения, поэтому необходимо использовать одинарные кавычки ('...'). Альтернативой является экранирование этих символов, например-x\!\*.html.

Итак, ваша команда становится:

7z e -an '-ai!*' '-x!*.epub' '-x!*.pdf' '-x!*.html' '-x!*.azw3' '-x!*.mobi' '-x!*.txt' '-x!*.HTML' '-x!*.opf'

Я рекомендую сделать флаг включения более конкретным, чем *, потому что он выберет все файлы в каталоге. И поскольку вы использовалиe команда (не x), и вы не указали выходной каталог (с -oflag), текущий каталог будет заполнен всеми файлами из вашего архива. Это означает, что если вы снова запустите ту же команду,* селектор теперь будет выбирать не только архивы, но и все извлеченные файлы.

Если вы хотите исключить полный каталог (возможно, этот файл расширения разделен в каталоге)

 7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on ~/bkpFile_$(date +"%d_%b_%Y").1.7z /home/ubuntu/projectfile -mx0 '-xr!vendor' '-xr!view' '-xr!documents' 

Здесь каталог поставщиков, представлений и документов исключен.

Другие вопросы по тегам