Bash - создает zip путем нахождения файлов

Я хочу создать сценарий удара, которые находят *.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)
0
задан 2 August 2015 в 20:28

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
2
ответ дан 29 July 2019 в 21:33

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. Снова Вы не получите преимущества сжатия.

2
ответ дан 29 July 2019 в 21:33

Используйте это для сжатия всех .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" " "`

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

Просто выполните итерации через весь найденный .mp4 пути файла, например:

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

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

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

-1
ответ дан 29 July 2019 в 21:33

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

Похожие вопросы: