Есть ли способ сжать все файлы в данном каталоге с помощью zip
команды? Я слышал об использовании *.*
, но я хочу, чтобы он работал и для файлов без расширений.
command-line
wildcards
zip
tkbx
источник
источник
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
означает любой файл с точкой. В cp / m и dos все файлы имеют точку, и это заставляет вас печатать ее (не может сделать*
). Поэтому люди пришли посмотреть*.*
как все файлы. В конце концов Microsoft добавила длинные имена файлов, которые могли иметь ноль или больше точек. Чтобы найти файл с точкой на окнах, вы должны набрать*.*.*
.Ответы:
Вы можете просто использовать
*
; в этом нет необходимости*.*
. Расширения файлов не являются специальными в Unix.*
соответствует нулю или более символов - включая точку Так что это соответствуетfoo.png
, потому что это ноль или более символов (семь, если быть точным).Обратите внимание, что
*
по умолчанию не совпадает с файлами, начинающимися с точки (не совпадает*.*
). Это часто то, что вы хотите. Если нет, то в bash, если выshopt -s dotglob
это сделаете (но все равно исключите.
и..
). В других оболочках есть разные способы (или их вообще нет) включения файлов точек.В качестве альтернативы
zip
также имеется-r
(рекурсивная) опция для одновременного создания целых деревьев каталогов (и не нужно беспокоиться о проблеме с точечным файлом):где
mydir
находится каталог, содержащий ваши файлы. Обратите внимание, что созданный zip-файл будет содержать как структуру каталогов, так и файлы. Как отмечает Петерф в своем комментарии, это обычно рассматривается как хорошая вещь: распаковка zip аккуратно сохранит все извлеченные файлы в одном подкаталоге.Вы также можете сказать , почтовый индекс , чтобы не сохранять пути с
-j
/--junk-paths
опции.Команда
zip
поставляется с документацией, рассказывающей обо всех ее (многих) параметрах; введите,man zip
чтобы увидеть эту документацию. Это не уникально для почтового индекса; таким образом вы можете получить документацию для большинства команд.источник
*
глобализация оболочки не включает точечные файлы (т. Е. Имена файлов начинаются с.
). Это еще одно преимущество для архивирования всего каталога по имени..
и..
?В моем случае я хотел сжать каждый файл в свой собственный архив, поэтому я сделал следующее (в
zsh
):источник
mkv
? Также здесь нет ничего особенно специфическогоzsh
. Вы захотите правильно заключить в кавычки любую переменную, содержащую имя файла, поэтомуzip "${file%.*}.zip" "$file"
двойные кавычки вокруг обеих переменных.mkv
. Во-вторых, цитирование аргументов не нужно, вzsh
отличие отbash
. Вот почему я указал, что это была команда дляzsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(с-P
настройкой в зависимости от потоков вашего процессора ...) (Многие зависимости GNU ...)Другим способом было бы использовать find и xargs: (это может включать в себя каталог «.» В zip, но он все равно должен извлекаться правильно. В моем тесте zip удалил точку перед сжатием)
find . -type f -exec zip zipfile.zip {} +
(
+
Можно заменить на,\;
если ваша версияfind
не поддерживает+
конец для exec. Хотя это будет медленнее ...)Это будет по умолчанию включать все подкаталоги. На GNU find
-maxdepth
может предотвратить это.источник
*
, это будет включать в себя точечные файлы и не упадет, если в каталоге слишком много файлов)Другой (медленный) метод для этого (который добавляет один файл в zip за раз):
При этом возникают проблемы с точечным
*
файлом (добавлено обходное решение), и для каждого файла запускается zip один раз, добавляя его в архив. Вbash
, это будет иметь дело с большим количеством файлов.Это будет медленнее, чем большинство других методов, но относительно просто.
источник
for f in *; do zip zip.zip "$f"; done