*è 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, mkshné 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/
zshrisolto anche quell'altro malfunzionamento della shell Bourne in quanto se il modello non corrispondeva, il mvcomando 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 bashnon 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, bashnon include .né ..in globs like *, ma lo fa ancora per globs like .*.
Se imposti la GLOBIGNOREvariabile su qualcosa di non vuoto, abilita automaticamente l' dotglobopzione ed esclude .e ..dai .*glob ma non da dir/.*o .*/filequelli (!) 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 dotglobabilitato) per espandere dotfile tranne .e ...
pesce
fishglobs 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 -- /destse non ci sono file.
ksh93
Nessun qualificatore glob in ksh93neanche. Puoi includere dotfile in globs con:
FIGNORE='@(.|..)'
Contrariamente a bashs' GLOBIGNORE, che è fatto correttamente e anche le correzioni al problema della .*inclusi .e ...
Yash
yashha dot-globun'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 ..).