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