Из-за специфики моих потребностей в архивировании я не очень хорошо разбираюсь в твердых архивах tar.gz и вместо этого использую 7z.
Я использую следующую команду для этого:
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*
Создать архив всего внутри ~/my/folder/
как ~/my/folder.7z
файл.
Но ~/my/folder/.hiddenFolder
тогда не попаду в архив. Как это исправить? Не *
должен вернуть все файлы и папки?
*
, попробуйте удалить его, 7z должен заархивировать весь каталог.bash
- может быть, я неправильно использую «расширение пути bash»?Ответы:
Если вы хотите, чтобы содержимое одного каталога было проще, сначала измените его:
То, что вы видели, это то, что
*
расширяется до списка имен файлов, которые не начинаются с.
. Это задокументированное поведение, и это основная причина, по которой файлы, имена которых начинаются с символа,.
называются скрытыми (другая причина -ls
они не отображаются по умолчанию).Не существует действительно удобного переносимого способа перечисления всех файлов в каталоге. Ты можешь использовать
но если нет файла, соответствующего одному из шаблонов, шаблон останется нерасширенным. В bash вы можете установить
dotglob
опцию, чтобы избежать особой обработки ведущего.
(.
и..
все еще исключены из матчей):В ksh или в bash, если вы установили
extglob
параметр (или в zsh, если вы установилиksh_glob
параметр), вы можете написать шаблон, который соответствует всем файлам, кроме.
и..
:В zsh есть более простой способ сказать, что
.
не должен обрабатываться специально в шаблоне:источник
TL; DR
Больше примеров
Пример структуры каталогов
Попробуйте следующие команды
Корневая папка со всем ее содержимым.
дает
Нет корневой папки и нет скрытых файлов
дает
Нет корневой папки, но скрытые файлы включены (это то, что мы обычно хотим)
дает
источник
shopt
.Нет,
*
не предполагается возвращать все файлы. Возвращает только видимые.Более простое решение:
источник