*это шар, который расширяется оболочкой. По умолчанию оболочки не включают файлы, имена которых начинаются с .(называемые скрытыми файлами или точечными файлами), если только начальный не .введен буквально.
*или [.]*или ?*или *.*или dir/*не будут включать точечные файлы.
.*или dir/.*будет.
Так что вы могли бы сделать:
mv -- * .* /dest/
однако некоторые оболочки, в том числе bash(но не zsh, mkshни fish), имеют ту ошибочную характеристику, что расширение .*включает в себя .и ..специальные записи каталога, что вам здесь не нужно (и, как правило, никогда не требует включения глобуса, поэтому я и называю это ошибкой).
По этой причине вы обнаружите, что иногда люди используют (в оболочках типа Борна):
mv -- * .[!.]* ..?* /dest/
Это три глобуса, первый из которых соответствует не скрытым файлам, второй - имена файлов, начинающиеся с .символа, за которым следует другой символ, .а третий - имена файлов, начинающиеся с ..символа, за которым следует хотя бы один символ.
Однако у некоторых современных оболочек есть лучшие способы обойти это
ЗШ
С помощью zshвы можете использовать (D)спецификатор glob, чтобы указать, что глобус должен включать точечные файлы:
mv -- *(D) /dest/
zshтакже исправлено другое несоответствие оболочки Bourne в том, что если шаблон не совпадает, mvкоманда не запускается.
Как сказано выше, он также никогда не будет включать .ни ..в свои глобусы, так
mv -- * .* /dest/
будет в безопасности. Однако, если нет соответствующего файла *или нет соответствующего файла, .*команда будет прервана, поэтому было бы лучше использовать:
mv -- (*|.*) /dest/
Как и в некоторых других оболочках, вы также можете заставить все глобусы включать точечные файлы (например, если вы хотите, чтобы точечные файлы включались чаще, чем нет) с помощью:
setopt dotglob
или же:
set -o dotglob
После этого, если вы хотите, чтобы определенный глобус не включал точечные файлы, вы можете написать это:
echo *(^D)
Или же:
echo [^.]*
удар
К сожалению bash, нет глобальных классификаторов. Таким образом, вы можете включить глобальное включение dotfile. В bashсинтаксис:
shopt -s dotglob
(и использовать [^.]*для шаров без скрытых файлов).
С dotglob, bashне включает .ни ..в глобусы, как *, но все же делает для глобусов, как .*.
Если вы установите GLOBIGNOREпеременную в непустое значение, она автоматически включит эту dotglobопцию и исключит .и ..из .*глобусов, но не из dir/.*или .*/fileиз (!), Так что защита практически бесполезна. Вы могли бы сделать, GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'но тогда это сломало бы шары как */.или ./*или ../*.
Лучшее решение - использовать [.]*или dir/[.]*или [.]*/file(с dotglobвключенным) для расширения файлов точек, кроме .и ...
рыбы
fishшары не включают .ни ... Когда нет совпадения, в зависимости от версии, он будет работать как zsh(или bash -o failglob) или bash -o nullglob.
mv -- * .* /dest/
Будет работать, если есть как скрытые, так и не скрытые файлы. В противном случае, YMMV и с некоторыми версиями, он может вызвать, mv -- /destесли нет файла вообще.
ksh93
Никаких глобус-классификаторов ksh93тоже нет. Вы можете включать дотфайлы в глобусы с помощью:
FIGNORE='@(.|..)'
В отличие от bashs GLOBIGNORE, это сделано правильно, а также устраняет проблему .*включения .и ...
йаш
yashимеет dot-globпараметр ( set -o dot-glob), но в отличие bashот глобальных расширений (даже *) включает, .и ..поэтому он довольно бесполезен.
Tcsh
set globdot
Работает как в bash, то есть *включает файлы точек, кроме .и, ..но .*все еще включает в себя .и ..(и вы можете использовать [.]*для расширения скрытых файлов, кроме .и ..).