Table des matières

, , , ,

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