Отказ от ответственности: Этот ответ соглашения с Bash конкретно, но большой частью его относится к вопросу относительно шаблонов шарика!
Звездообразный символ (*
) подстановочный знак. Существует определенный набор символов, что он займет место и первый символ, являющийся точкой (.
) не один из них. Это - особый случай только из-за того, как файловые системы Unix работают, файлы, которые запускаются с точки, считают "скрытыми". Это означает это инструменты такой как cp
, ls
, и т.д. не будет "видеть" их, если явно не сказали, чтобы сделать так.
Сначала давайте создадим некоторые демонстрационные данные.
$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
Таким образом, теперь у нас есть следующее:
$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
Теперь давайте играть в некоторые игры. Можно использовать команду echo
перечислять что конкретный подстановочный знак (*
) был бы для данной команды как так:
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2
$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .dotdir*
.dotdir1 .dotdir2
Можно использовать команду shopt -s dotglob
изменить поведение *
так, чтобы в дополнение к файлам как regfile1
это будет также соответствовать .dotfile1
.
выборка от bash
страница справочника
dotglob If set, bash includes filenames beginning with a `.' in the results
of pathname expansion.
Пример:
$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
Можно вернуться это поведение с этой командой:
$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
Для Вас Вы говорите cp
то, что Вы хотите скопировать все файлы, которые соответствуют шаблону *
, и нет никаких файлов.
$ cp foo/.* .
Или можно сделать это, если Вы хотите все в foo
папка:
$ cp foo .
Или можно быть явными:
$ cp foot/.* foo/* .
Более компактная форма с помощью расширения фигурной скобки в bash
:
$ cp foo/{.,}* .
В любое время можно использовать echo
прием для наблюдения, что предложенные шаблоны файла (это - необычный термин для того, что звезда является частью).
$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
Случайно, если Вы собираетесь скопировать каталог файлов + другие каталоги, Вы обычно хотите сделать это рекурсивно, это -R
переключатель к cp
:
$ cp -R foo/. .
Есть много способов сделать это. Способ, о котором вы упомянули, может быть одним из них. xterm
- это программа, которая выполняет другую программу - она обертывает другую программу в pty - обычно Вашу оболочку - и направляет входные данные, которые Вы ее подаете, на обернутые программы. Дело в том, что псевдотерминалы - это просто эмулируемые устройства - и поэтому xterm
угадывает, на каком устройстве Вы в конечном итоге будете набирать на нем текст. Конечно, можно получить гораздо более конкретную информацию. xterm
учитывает все виды переменных окружения - а еще лучше - xresources.
Из man xterm
:
ttyModes
(класс TtyModes
).
^
char
(например, ^c
или ^u
) и ^?
могут быть использованы для указания удаления (127). Используйте ^-
для обозначения undef. Используйте \034
для обозначения ^\
, так как буквенный обратный слеш в ресурсе X ускользает от следующего символа. stty
каждый раз при запуске xterm
. Однако обратите внимание, что программа stty
на данном хосте может использовать различные ключевые слова;
Таблица xterm
является встроенной. ttyModes
указывает значение для стирания, то это отменяет настройку ресурса ptyInitialErase
, т.е. xterm
.
инициализирует терминал для соответствия этому значению.