Заблокировать все файлы в каталоге?

Есть ли способ заархивировать все файлы в данном каталоге с помощью команды zip? Я слышал об использовании *.*, но я хочу, чтобы он также работал с файлами без продолжения.

341 голос | спросил tkbx 28 32012vEurope/Moscow11bEurope/MoscowWed, 28 Nov 2012 20:43:54 +0400 2012, 20:43:54

4 ответа


514

Вы можете просто использовать *; нет необходимости в *.*. Расширения файлов не уникальны в Unix. * соответствует нулю или более символов - включая точку. Таким образом, он соответствует foo.png, потому что это ноль или более символов (семь, если быть точным).

Обратите внимание, что * по умолчанию не соответствует файлам, начинающимся с точки (не имеет значения *.*). Это часто то, что вы хотите. Если нет, в bash, если вы shopt -s dotglob, он будет (но все равно будет исключать . и ..)). Другие оболочки имеют разные способы (или вообще отсутствуют) включения точечных файлов.

В качестве альтернативы zip также имеет параметр -r (рекурсивный) для создания целых деревьев каталога сразу (и не нужно беспокоиться о проблеме с dotfile):

zip -r myfiles.zip mydir

где mydir - это каталог, содержащий ваши файлы. Обратите внимание, что полученный zip будет содержать структуру каталогов, а также файлы. Как отмечает пэтерф в своем комментарии, это обычно рассматривается как хорошая вещь: извлечение zip будет аккуратно хранить все извлеченные файлы в одном подкаталоге.

Вы также можете указать zip, чтобы не сохранять пути с помощью опции -j /--junk-paths.

Команда zip содержит документацию, сообщающую вам обо всех ее (многих) опциях; введите man zip, чтобы увидеть эту документацию. Это не уникально для zip; вы можете получить документацию для большинства команд таким образом.

ответил derobert 28 32012vEurope/Moscow11bEurope/MoscowWed, 28 Nov 2012 20:49:12 +0400 2012, 20:49:12
4

Другим способом было бы использовать find и xargs: (это может включать в себя каталог «.» в zip, но он все равно должен извлекаться правильно. С моим тестом zip разделил точку перед сжатием) find . -type f -exec zip zipfile.zip {} +

(+ может быть заменен на \;, если ваша версия find не поддерживает + end для exec. Это будет медленнее, хотя ...)

Это будет по умолчанию включать все подкаталоги. В GNU find -maxdepth может помешать это.

ответил Gert van den Berg 29 42012vEurope/Moscow11bEurope/MoscowThu, 29 Nov 2012 12:28:04 +0400 2012, 12:28:04
4

В моем случае я хотел заархивировать каждый файл в свой собственный архив, поэтому я сделал следующее (в zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
ответил Radon Rosborough 17 Jpm1000000pmTue, 17 Jan 2017 19:32:16 +030017 2017, 19:32:16
0

Другой (медленный) метод для этого (который одновременно добавляет один файл в zip-файл):

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

У этого есть проблемы с dotfile * (обходной путь добавлен) и будет запускать zip один раз для каждого файла, добавив его в архив. В bash он будет обрабатывать большое количество файлов.

Это будет медленнее, чем большинство других методов, но относительно просто.

ответил Gert van den Berg 17 Maypm18 2018, 19:12:45

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132