*
являє собою глобус, розширений оболонкою. За замовчуванням оболонки не включають файли, ім'я яких починається з .
(називаються приховані файли або dotfiles), якщо ведучі .
не вводяться буквально.
*
або [.]*
або ?*
або *.*
або 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
Після цього, якщо ви хочете, щоб певний глобус не включав dotfiles, ви можете написати його:
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
якщо файл взагалі не існує.
кш93
Жоден глобальний класифікатор ksh93
жоден. Ви можете включити точкові файли в глобуси за допомогою:
FIGNORE='@(.|..)'
На відміну від bash
s GLOBIGNORE
, це зроблено належним чином, а також вирішує проблему .*
включення .
та ..
.
яш
yash
має dot-glob
опцію ( set -o dot-glob
), але, всупереч bash
, розширення (навіть *
) глобальної сфери включають, .
і ..
тому це досить марно.
тч
set globdot
Працює як у bash
, тобто *
включає файли з крапками, за винятком .
і, ..
але .*
все ще включає в себе .
і ..
(і ви можете використовувати [.]*
для розширення прихованих файлів, крім .
і ..
).