{{tag>dev bash shell move déplacer}}
====== Déplacer les fichiers cachés avec mv ======
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''
===== L'option dotglob =====
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.
===== Utiliser le développement entre accolades =====
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.
===== Références =====
* [[https://askubuntu.com/questions/259383/how-can-i-get-mv-or-the-wildcard-to-move-hidden-files#259386|Comment prendre les fichiers cachés avec le wilcard (askubuntu)]]