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

Попробуйте запустить компьютер. Для меня это решило проблему. Я думаю, что это должно быть связано со старой версией панели или меню или с ненужными библиотеками.

1
задан 2 August 2015 в 20:28

2 ответа

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

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

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

EDIT:

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

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

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

2
ответ дан 23 May 2018 в 18:34
  • 1
    +1 Хороший ответ, но у меня есть вопрос. Плохо использовать find . -type f -name '*.mp4' -exec bash -c 'zip "${1%.mp4}".zip "$0"' {} \; вместо этого? – A.B. 2 August 2015 в 20:35
  • 2
    @ A.B. Вам нужно ${0%.mp4}, я знаю его опечатку :) .. В этом случае он не будет иметь никакого отношения к $0, но представьте себе обычный случай, когда вы хотите получить все аргументы с помощью $@, поскольку $0 не показан, а bash -c запускает аргументы с 0, поэтому да, огромная проблема .. – heemayl 2 August 2015 в 20:45

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

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

Объяснение:

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

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

find . -name \*.mp4 -print

Чтобы перечислить все выходные данные в одной строке, разделенные space, как мы (

$ 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 [ ! d10]

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

-1
ответ дан 23 May 2018 в 18:34
  • 1
    tanx для помощи. но я хочу создать каждый mp4 для zip. Пример: a.mp4 - a.zip и b.mp4 - b.zip – Ehsan 2 August 2015 в 16:38
  • 2
    -1 Не работает с пробелами в имени файла. И не используйте `…`, вместо этого используйте $(…) – A.B. 2 August 2015 в 20:29
  • 3
    @Ehsan обновленный ответ. – yask 3 August 2015 в 13:32

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

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