*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, mkshni 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/
zsha également corrigé cette autre erreur du shell Bourne en ce que si le modèle ne correspond pas, la mvcommande 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 bashn'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, bashn'inclut pas .ni ..dans les globes comme *, mais le fait toujours pour les globes comme .*.
Si vous définissez la GLOBIGNOREvariable sur quelque chose de non vide, elle active automatiquement l' dotgloboption et exclut .et ..des .*globs mais pas de dir/.*ou .*/fileceux (!) 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 dotglobactivé) pour développer les fichiers dot à l'exception de .et ...
poisson
fishles 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 -- /dests'il n'y a pas de fichier du tout.
ksh93
Aucun qualificatif global dans les ksh93deux 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
yasha une dot-globoption ( 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 ..).