Bash - создайте zip, найдя файлы

Я хочу создать скрипт bash, который находит *.mp4 а также zip Это.

Я использую это:

#!/bin/sh
zip -r $(find . -name '*.mp4').zip $(find "/home/ehsan/Desktop" -name '*.pdf')

но не работает и получаю эту ошибку:

zip error: Zip file structure invalid (./Bank_Mellat_v3.2_hassas-computer.com/Help.pdf)

3 ответа

Решение

Архивирование всех файлов в один архив

Вы можете сжать все файлы с базовым именем, совпадающим с *.mp4, найденным в текущем каталоге, в один архив с помощью следующей команды:

zip my_mp4_archive.zip $(find . -name "*.mp4")

Архивирование каждого файла в отдельный архив

Следующий скрипт будет архивировать каждый файл по отдельности, в том же каталоге, в котором хранится сам файл.

files=$(find . -name "*.mp4")

for f in $files; do
  echo "Compressing $f"
  (cd $(dirname $f) && zip $(basename $f.zip) $(basename $f))
done

zip один может сделать это. Также обратите внимание, что zip-ин mp4 Файлы неэффективны, так как они не дадут вам никаких преимуществ в том, что касается пространства, поскольку они уже находятся в сжатом формате MPEG4.

Чтобы найти все .mp4 файлы рекурсивно начинаются с текущего каталога и сохраняются как files.zip:

zip files.zip -r . -i '*.mp4'
  • -r обозначает рекурсивную операцию

  • -i '*.mp4 указывает единственный интересующий нас шаблон

РЕДАКТИРОВАТЬ:

После прочтения ваших комментариев, кажется, вы хотите найти каждый .mp4 файл и создать zip только из этого файла, а также хочу сделать это для всех .mp4 файлы рекурсивно. Если что так:

find . -type f -name '*.mp4' -exec bash -c 'zip "${1%.mp4}".zip "$1"' _ {} \;

Это найдет все .mp4 файлы рекурсивно смотрят из текущего каталога и zip их каждый в отдельности. Так foo.mp4 будет zipв форме foo.zip, Опять же, вы не получите никакого преимущества от сжатия.

Используйте это, чтобы сжать все .mp4 файлы в базовом каталоге и его подкаталогах.

$ zip test.zip `find . -name \*.mp4 -print | tr "\n" " "`

Пояснение:

Сжать файл zip file-name.zip path1 path2...

Чтобы получить все пути к файлам, имеющие .mp4 расширение в базовом каталоге и все его использование подкаталога find:

find . -name \*.mp4 -print

Чтобы вывести все выходные данные в одну строку, разделенную space как мы требуем в нашем zip командная труба через tr "\n" " "

Собираем все вместе:

$ zip test.zip `find . -name \*.mp4 -print | tr "\n" " "`

Обновление После прочтения комментария ОП:

Просто перебрать все найденное .mp4 имена файлов, например:

for p in `find . -name \*.mp4 -print`                                                                                                           
do
    zip $p.zip $p
done

Если ваше имя файла содержит пробел, вы tr заменить space с backslash space

Например: использовать $p | tr ' ' "\' '" вместо $p,

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