*
è un glob che viene espanso dalla shell. Per impostazione predefinita, le shell non includono file il cui nome inizia con un .
(chiamato file nascosti o dotfile) a meno che il lead non .
sia inserito letteralmente.
*
o [.]*
o ?*
o *.*
o dir/*
non includerà dotfile.
.*
o dir/.*
volontà.
Quindi potresti fare:
mv -- * .* /dest/
tuttavia alcune shell tra cui bash
(ma non zsh
, mksh
né fish
) hanno quella cattiva funzionalità che l'espansione di .*
include le voci di directory speciali .
e ..
, che non si desidera qui (e generalmente non si desidera che un glob includa, motivo per cui lo chiamo malfunzionamento).
Per questo motivo, scoprirai che a volte le persone usano (nelle shell tipo Bourne):
mv -- * .[!.]* ..?* /dest/
Sono tre globs, il primo corrispondente a file non nascosti, il secondo nome file che inizia con .
seguito da un carattere diverso da .
e il terzo nome file che inizia con ..
seguito da almeno un carattere.
Tuttavia alcune conchiglie moderne hanno modi migliori per aggirare questo
zsh
Con zsh
, puoi usare il (D)
qualificatore glob per specificare che il glob dovrebbe includere dotfile:
mv -- *(D) /dest/
zsh
risolto anche quell'altro malfunzionamento della shell Bourne in quanto se il modello non corrispondeva, il mv
comando non veniva eseguito.
Come detto sopra, non includerà mai .
né ..
nei suoi globs, quindi
mv -- * .* /dest/
sarà al sicuro. Tuttavia, se non è presente alcuna corrispondenza file *
o corrispondenza file, .*
il comando verrà interrotto, quindi sarebbe meglio usare:
mv -- (*|.*) /dest/
Come in alcune altre shell, puoi anche forzare tutti i globs a includere dotfile (ad esempio se ti ritrovi a desiderare dotfile inclusi più spesso) con:
setopt dotglob
o:
set -o dotglob
Dopodiché, se vuoi che un particolare glob non includa dotfile, puoi scriverlo:
echo *(^D)
O:
echo [^.]*
bash
Sfortunatamente bash
non ha le qualificazioni glob. Quindi ti rimane con l'abilitazione dell'inclusione dotfile a livello globale. In bash
, la sintassi è:
shopt -s dotglob
(e utilizzare [^.]*
per globs senza file nascosti).
Con dotglob
, bash
non include .
né ..
in globs like *
, ma lo fa ancora per globs like .*
.
Se imposti la GLOBIGNORE
variabile su qualcosa di non vuoto, abilita automaticamente l' dotglob
opzione ed esclude .
e ..
dai .*
glob ma non da dir/.*
o .*/file
quelli (!) In modo che la protezione sia piuttosto inutile. Si potrebbe fare, GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
ma poi si spezzerebbe globs come */.
o ./*
o ../*
.
Una soluzione migliore consiste nell'utilizzare [.]*
o dir/[.]*
o [.]*/file
(con dotglob
abilitato) per espandere dotfile tranne .
e ..
.
pesce
fish
globs non includono .
né ..
. Quando non c'è corrispondenza, a seconda della versione, funzionerà come zsh
(o bash -o failglob
) o bash -o nullglob
.
mv -- * .* /dest/
Funzionerebbe se ci sono sia file nascosti che non nascosti. Altrimenti, YMMV e con alcune versioni, potrebbe chiamare mv -- /dest
se non ci sono file.
ksh93
Nessun qualificatore glob in ksh93
neanche. Puoi includere dotfile in globs con:
FIGNORE='@(.|..)'
Contrariamente a bash
s' GLOBIGNORE
, che è fatto correttamente e anche le correzioni al problema della .*
inclusi .
e ..
.
Yash
yash
ha dot-glob
un'opzione ( set -o dot-glob
), ma al contrario bash
, le espansioni glob (anche di *
) includono .
e ..
quindi è piuttosto inutile.
tcsh
set globdot
Funziona come in bash
, ovvero *
include file dot tranne .
e ..
ma .*
include ancora .
e ..
(e puoi usare [.]*
per espandere file nascosti tranne .
e ..
).