{{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)]]