Как найти список файлов и заархивировать их в один zip-файл?

Параметр разрешений игнорируется и автоматически изменяется на default_permissions всякий раз, когда в него также включается любой из следующих параметров:

uid , gid , umask , dmask или fmask

Чтобы исправить это, вы можете использовать user_id и group_id вместо uid и gid .

Но вы не должны использовать umask , dmask или fmask с разрешениями .

Вы поймете, что это работает, когда получите следующий статус от mount:

Использование сопоставления пользователей по умолчанию


Обратите внимание, что изначально все файлы принадлежат пользователю root. Возможно, вы захотите изменить их рекурсивно, чтобы они принадлежали вам.

2
14.01.2017, 02:18
2 ответа

-exec принимает два параметра: команду для выполнения и флаг, сообщающий find , должна ли команда запускаться один раз за совпадение (; ) или как максимальное количество файлов за запуск ( + ).

Кроме того, параметры zip неверны.

Тест -name тоже не работает; требуется только один шаблон за раз. Если вы хотите проверить несколько шаблонов, вам нужно использовать несколько тестов -name , объединенных с помощью -o («или»), и заключить их в круглые скобки (спасибо xhienne за указание на это):

find /lmms/samples/ \( -name "warp01*" -o -name "JR_effect2k*" ... \) -exec ...

(цитирование каждого шаблона во избежание проблем с подстановкой оболочки).

В общем, если вы исправите свои проверки имен и завершите свой find на

-exec zip ~/Desktop/files.zip {} +

, все должно работать правильно.

11
27.01.2020, 21:49

Вам просто нужно завершить опцию -exec с помощью ; или + ( человек находит ). Ваш файл zip должен предшествовать файлам, которые вы помещаете в свой архив IIRC, поэтому он будет выглядеть следующим образом:

find ... -exec zip ~/Desktop/files.zip {} ;
find ... -exec zip ~/Desktop/files.zip {} +

Версия + объединяет параметры в конце zip и вызывает один zip для всех файлов (или несколько zip , если ваши команды действительно длинные). Это менее интенсивно ввод-вывод, но недостатком является то, что вы можете использовать {} только один раз и в конце, непосредственно перед + . Версия ; более гибкая, но вызывает zip для каждого файла.

Альтернативное решение без find

У вас также есть проблема с предикатом -name , и @StephenKitt дает вам правильный синтаксис.

Вот еще один синтаксис, который использует способность zip понимать шаблоны подстановки, такие как file * . Поэтому он не использует find , он ближе к вашему исходному предложению и, вероятно, менее подвержен ошибкам для тех, кто не привык к find :

$ zip -r  ~/Desktop/files.zip /lmms/samples/ --include 'warp01*' 'JR_effect2k*' 'clean_low_key*' 'q_kick_2*' 'sticky_q_kick*' 'upright_bass*' 'pizzi*' 'chorded_perc*' 'Tr77_kick*' 'Tr77_tom1*' 'Tr77_cym*' 'hihat_008a*' 'Hat_o.ds' 'Hat_c.ds' 'Kickhard.ds' 'Tr77_snare*'

Примечание: шаблоны разделяются пробелом . Кавычки вокруг них являются обязательными, иначе шаблоны могут быть интерпретированы вашей оболочкой, а не zip .

5
27.01.2020, 21:49

Теги

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