dotglobтранслируются globdotsпо Zsh , которая недопустимое имя опции для Баша .
Ответы:
19
Отказ от ответственности: Этот ответ касается конкретно Bash, но большая часть его относится к вопросу о шаблонах глобуса!
Символ звезды ( *) является подстановочным знаком. Есть определенный набор символов, который он заменит, и первый символ, являющийся точкой ( .), не является одним из них. Это особый случай только из-за того, как работают файловые системы Unix, файлы, начинающиеся с точки, считаются «скрытыми». Это означает, что такие инструменты, как cp,ls и т. Д. Не будут «видеть» их, если явно не указано иное.
Примеры
Сначала давайте создадим несколько примеров данных.
$ tree -a
.|--.dotdir1
|--.dotdir2
|--.dotfile1
|--.dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
Теперь давайте поиграем в некоторые игры. Вы можете использовать команду, echoчтобы перечислить, какой будет подстановочный знак ( *) для данной команды, например:
Вы можете использовать команду, shopt -s dotglobчтобы изменить поведение *так, чтобы в дополнение к файлам, как regfile1это также будет соответствовать.dotfile1 .
выдержка из bashсправочной страницы
dotglob Ifset, bash includes filenames beginning with a `.' in the results
of pathname expansion.
Для вас вы говорите, cpчто хотите скопировать все файлы, которые соответствуют шаблону *, и нет никаких файлов.
$ cp foo/.*.
Или вы можете сделать это, если хотите все в fooпапке:
$ cp foo .
Или вы можете быть явным:
$ cp foot/.* foo/*.
Более компактная форма с использованием расширения скобки в bash:
$ cp foo/{.,}*.
В любое время вы можете использовать echoтрюк, чтобы увидеть, какие у вас предложены шаблоны файлов (это причудливый термин для обозначения того, что является звездой).
Вы можете упомянуть использование shopt -s dotglob, а echo *затем дает:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
Драв Слоан
@DravSloan - спасибо за предложение. Добавил это.
СЛМ
cp -r foo .как правило, не будет работать, так cpкак откажется копировать fooсам, вы, вероятно, подразумевали cp -R foo/. .. (обратите внимание, что cp -Rэто стандартный).
Стефан Шазелас
1
Также отметим, что (вполне разумно) zshне включает .и ..в расширение .*. В zsh, если шаблон не соответствует, то команда прерывается (вполне здраво снова), так что в общем случае, cp foo/{,.}* .не получится, если нет не скрыто или нет не-скрытых файлов.
Стефан Шазелас
7
Этот ответ относится только к bash. Аскер использует zsh, где ответ намного проще и shoptне существует.
Жиль "ТАК - перестань быть злым"
29
С zshтипичным способом является использование Dспецификатора glob (для включения [D] ot файлов):
cp foo/*(D).
Обратите внимание, что с или без D, zsh-глобусы никогда не включают .ни ..(как вы ожидаете).
Если вы хотите скопировать все файлы и каталоги из одного места в другое, вы можете использовать стандартную rsyncкоманду. В приведенном выше примере:
mkdir foo && touch foo/.test
rsync -a foo/.
будет рекурсивно копировать все содержимое foo, включая скрытые файлы и скрытые каталоги, в текущий каталог. Конечный слеш в конце foo/важен для rsync; при этом fooкопируется только содержимое , без него также копируется rsync foo. Например:-
mkdir src && mkdir dest && touch src/.test
rsync -a src dest // copies 'src' contents to 'dest/src'
rsync -a src/ dest // copies 'src' contents to 'dest'
Есть много других доступных опций настройки rsync, включая копирование между компьютерами.
Zsh- ответ Стефана Шазеласа верен для одного выражения с глобусом в нем. Однако, если вы хотите установить его для всех выражений по умолчанию, вы можете использовать
setopt GLOB_DOTS
Положите его в свой, ~/.zshrcчтобы сделать его постоянным.
dotglob
транслируютсяglobdots
по Zsh , которая недопустимое имя опции для Баша .Ответы:
Отказ от ответственности: Этот ответ касается конкретно Bash, но большая часть его относится к вопросу о шаблонах глобуса!
Символ звезды (
*
) является подстановочным знаком. Есть определенный набор символов, который он заменит, и первый символ, являющийся точкой (.
), не является одним из них. Это особый случай только из-за того, как работают файловые системы Unix, файлы, начинающиеся с точки, считаются «скрытыми». Это означает, что такие инструменты, какcp
,ls
и т. Д. Не будут «видеть» их, если явно не указано иное.Примеры
Сначала давайте создадим несколько примеров данных.
Итак, теперь у нас есть следующее:
Теперь давайте поиграем в некоторые игры. Вы можете использовать команду,
echo
чтобы перечислить, какой будет подстановочный знак (*
) для данной команды, например:Изменение поведения?
Вы можете использовать команду,
shopt -s dotglob
чтобы изменить поведение*
так, чтобы в дополнение к файлам, какregfile1
это также будет соответствовать.dotfile1
.выдержка из
bash
справочной страницыПример:
Вы можете восстановить это поведение с помощью этой команды:
Ваша ситуация?
Для вас вы говорите,
cp
что хотите скопировать все файлы, которые соответствуют шаблону*
, и нет никаких файлов.Или вы можете сделать это, если хотите все в
foo
папке:Или вы можете быть явным:
Более компактная форма с использованием расширения скобки в
bash
:В любое время вы можете использовать
echo
трюк, чтобы увидеть, какие у вас предложены шаблоны файлов (это причудливый термин для обозначения того, что является звездой).Кстати, если вы собираетесь скопировать каталог файлов + другие каталоги, вы, как правило, хотите сделать это рекурсивно, это
-R
переключение наcp
:источник
shopt -s dotglob
, аecho *
затем дает:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
cp -r foo .
как правило, не будет работать, такcp
как откажется копироватьfoo
сам, вы, вероятно, подразумевалиcp -R foo/. .
. (обратите внимание, чтоcp -R
это стандартный).zsh
не включает.
и..
в расширение.*
. Вzsh
, если шаблон не соответствует, то команда прерывается (вполне здраво снова), так что в общем случае,cp foo/{,.}* .
не получится, если нет не скрыто или нет не-скрытых файлов.shopt
не существует.С
zsh
типичным способом является использованиеD
спецификатора glob (для включения [D] ot файлов):Обратите внимание, что с или без
D
, zsh-глобусы никогда не включают.
ни..
(как вы ожидаете).источник
Оболочка обрабатывает эти файлы как скрытые, когда разрешает
*
символ, поэтомуcp
не получает ни одно из этих имен файлов в качестве аргументов.Вы можете скопировать их, явно указав
cp foo/.* .
источник
Если вы хотите скопировать все файлы и каталоги из одного места в другое, вы можете использовать стандартную
rsync
команду. В приведенном выше примере:будет рекурсивно копировать все содержимое
foo
, включая скрытые файлы и скрытые каталоги, в текущий каталог. Конечный слеш в концеfoo/
важен для rsync; при этомfoo
копируется только содержимое , без него также копируется rsyncfoo
. Например:-Есть много других доступных опций настройки rsync, включая копирование между компьютерами.
источник
Zsh- ответ Стефана Шазеласа верен для одного выражения с глобусом в нем. Однако, если вы хотите установить его для всех выражений по умолчанию, вы можете использовать
Положите его в свой,
~/.zshrc
чтобы сделать его постоянным.источник