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
,