*
est un glob qui est développé par le shell. Par défaut, les shells n'incluent pas les fichiers dont le nom commence par un .
(appelé fichiers cachés ou fichiers dot) sauf si le début .
est entré littéralement.
*
ou [.]*
ou ?*
ou *.*
ou dir/*
n'inclura pas les fichiers dot.
.*
ou le dir/.*
fera.
Vous pourriez donc faire:
mv -- * .* /dest/
Cependant, certains shells, y compris bash
(mais pas zsh
, mksh
ni fish
), ont cette erreur que l'expansion d' .*
inclure les entrées de répertoire spéciales .
et ..
, que vous ne voulez pas ici (et généralement ne voulez jamais un glob à inclure, c'est pourquoi je l'appelle une erreur).
Pour cette raison, vous constaterez que parfois les gens utilisent (dans des coquilles de type Bourne):
mv -- * .[!.]* ..?* /dest/
Il s'agit de trois globes, le premier correspondant aux fichiers non masqués, le second commençant par .
suivi d'un caractère différent de .
et le troisième commençant par ..
suivi d'au moins un caractère.
Cependant, certains obus modernes ont de meilleurs moyens de contourner cela
zsh
Avec zsh
, vous pouvez utiliser le (D)
qualificatif glob pour spécifier que le glob doit inclure des fichiers dot:
mv -- *(D) /dest/
zsh
a également corrigé cette autre erreur du shell Bourne en ce que si le modèle ne correspond pas, la mv
commande n'est pas exécutée.
Comme dit ci-dessus, il n'inclura jamais .
non plus ..
dans ses globes, donc
mv -- * .* /dest/
sera en sécurité. Cependant, s'il n'y a pas de correspondance de fichier *
ou de fichier correspondant, .*
la commande sera abandonnée, il serait donc préférable d'utiliser:
mv -- (*|.*) /dest/
Comme dans certains autres shells, vous pouvez également forcer tous les globs à inclure des dotfiles (par exemple si vous vous retrouvez à vouloir des dotfiles inclus le plus souvent) avec:
setopt dotglob
ou:
set -o dotglob
Après cela, si vous souhaitez qu'un glob particulier n'inclue pas de fichiers dot, vous pouvez l'écrire:
echo *(^D)
Ou:
echo [^.]*
Frapper
Malheureusement, il bash
n'y a pas de qualificatifs glob. Il vous reste donc à activer l'inclusion de fichiers dot à l'échelle mondiale. Dans bash
, la syntaxe est:
shopt -s dotglob
(et utiliser [^.]*
pour les globes sans fichiers cachés).
Avec dotglob
, bash
n'inclut pas .
ni ..
dans les globes comme *
, mais le fait toujours pour les globes comme .*
.
Si vous définissez la GLOBIGNORE
variable sur quelque chose de non vide, elle active automatiquement l' dotglob
option et exclut .
et ..
des .*
globs mais pas de dir/.*
ou .*/file
ceux (!) De sorte que la sauvegarde est assez inutile. Vous pourriez le faire, GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
mais cela briserait des globes comme */.
ou ./*
ou ../*
.
Une meilleure solution consiste à utiliser [.]*
ou dir/[.]*
ou [.]*/file
(avec dotglob
activé) pour développer les fichiers dot à l'exception de .
et ..
.
poisson
fish
les globes n'incluent pas .
ni ..
. Lorsqu'il n'y a pas de correspondance, selon la version, cela fonctionnera comme zsh
(ou bash -o failglob
) ou bash -o nullglob
.
mv -- * .* /dest/
Fonctionnerait s'il y avait des fichiers cachés et non cachés. Sinon, YMMV et avec certaines versions, il peut appeler mv -- /dest
s'il n'y a pas de fichier du tout.
ksh93
Aucun qualificatif global dans les ksh93
deux cas. Vous pouvez inclure des fichiers dot dans des globes avec:
FIGNORE='@(.|..)'
Contrairement à bash
's GLOBIGNORE
, cela se fait correctement et résout également le problème d' .*
inclusion de .
et ..
.
yash
yash
a une dot-glob
option ( set -o dot-glob
), mais contrairement à bash
, les extensions globales (même de *
) incluent .
et ..
donc c'est assez inutile.
tcsh
set globdot
Fonctionne comme dans bash
, c'est-à-dire *
inclure les fichiers dot sauf .
et ..
mais .*
inclut toujours .
et ..
(et vous pouvez utiliser [.]*
pour développer les fichiers cachés sauf .
et ..
).