Lors de la phase de globbing, l’interpréteur remplace les métacaractères tels que *
par les noms de fichiers. Par défaut ce développement n'inclus pas les fichiers cachés :
# Le dossier courant contient 3 fichiers # dont 1 est caché tree -a . . ├── fileA.txt ├── fileB.txt └── .hidden_file.txt 0 directories, 3 files # Afficher les valeurs après développement de '*' echo * fileA.txt fileB.txt
Ici on voit bien que lors du développement de '*' les fichiers fileA.txt
et fileB.txt
sont retournés mais pas .hidden_file.txt
Parmi les options de paramétrage de bash, dotglob permet de modifier ce comportement par défaut.
# Afficher la valeur de l'option shopt dotglob # Activer l'inclusion des fichiers lors de la phase de globbing shopt -s dotglob # Désactiver l'inclusion des fichiers cachés lors de la phase de globing shopt -u dotglob
Lorsque dotglob est définie, le développement inclus les fichiers dont le nom commence par un point:
shopt -s dotglob echo * fileA.txt fileB.txt .hidden_file.txt shopt -u dotglob echo * fileA.txt fileB.txt
Pour déplacer tous les fichiers d'un dossier avec la commande mv même les fichiers cachés, on peut donc utiliser cette option de configuration du bash :
# Le dossier dir_a contient un fichier caché tree -a dir_a/ dir_a/ ├── fileA.txt ├── fileB.txt └── .hidden_file.txt 0 directories, 3 files # Par défaut dotglob est désactivée shopt dotglob dotglob off # Déplacer les fichiers de dir_a -> dir_b mv --target-directory=dir_b/ dir_a/* # le globbing n'inclus pas les fichiers cachés # le fichier caché .hidden_file.txt n'est donc pas déplacé tree -a dir_a/ dir_a/ └── .hidden_file.txt 0 directories, 1 file
Lors de ce premier essai nous n'obtenons pas le résultat souhaité car le globbing n'inclus pas les fichiers cachés.
# Le dossier dir_a contient un fichier caché tree -a dir_a/ dir_a/ ├── fileA.txt ├── fileB.txt └── .hidden_file.txt 0 directories, 3 files # On active l'option dotglob shopt -s dotglob mv --target-directory=dir_b/ dir_a/* # Afficher le contenu du dossier dir_a tree -a dir_a/ dir_a/ 0 directories, 0 files
Cette fois, le globbing retournant aussi les fichiers cachés, tous les fichiers sont déplacés par la commande mv.
Le développement entre accolades (brace expansion) permet de traiter les fichiers cachés et les fichiers standards :
shopt -u dotglob # le repertoire dir_b contient 3 fichiers # dont un est caché tree -a dir_b/ dir_b/ ├── fileA.txt ├── fileB.txt └── .hidden_file.txt 0 directories, 3 files # Déplacer tous les fichiers de dir_b -> dir_a mv --target-dir=dir_a dir_b/{*,.[^.]*}
Ce développement permet de retourner tous les fichiers même ceux commençant par un point tout en excluant les deux entrées spéciales .
et ..
désignant respectivement le répertoire courant et le répertoire parent.