Я хочу создать сценарий удара, которые находят *.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)
можно архивировать все файлы с базовым именем, соответствующим *.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" " "`
Обновление После чтения комментария OP:
Просто выполните итерации через весь найденный .mp4
пути файла, например:
for p in `find . -name \*.mp4 -print`
do
zip $p.zip $p
done
Если Ваше имя файла содержит пробел, Вы заключаете нас в корпус tr
заменять space
с backslash space
Например: использовать $p | tr ' ' "\' '"
вместо $p
.