Comment déplacer tous les fichiers d'un répertoire (y compris ceux cachés) vers un autre répertoire ?
Par exemple, si j'ai un dossier "Foo" avec les fichiers ".hidden" et "notHidden" à l'intérieur, comment puis-je déplacer les deux fichiers dans un répertoire nommé "Bar" ? Ce qui suit ne fonctionne pas, car le fichier ".hidden" reste dans "Foo".
mv Foo/* Bar/
Essayez-le vous-même.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Réponse acceptée :
Zsh
mv Foo/*(DN) Bar/
ou
setopt -s glob_dots
mv Foo/*(N) Bar/
(Laissez de côté le (N) si vous savez que le répertoire n'est pas vide.)
Frapper
shopt -s dotglob nullglob
mv Foo/* Bar/
Ksh93
Si vous savez que le répertoire n'est pas vide :
FIGNORE='.?(.)'
mv Foo/* Bar/
Standard (POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
Si vous êtes prêt à laisser le mv commande renvoie un statut d'erreur même si elle a réussi, c'est beaucoup plus simple :
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU find et GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
Recherche standard
Si cela ne vous dérange pas de passer au répertoire source :
cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "[email protected]" "$0"' ../Bar/ {} + -type d -prune
Voici plus de détails sur le contrôle de la correspondance des fichiers de points dans bash, ksh93 et zsh.
Frapper
Définissez le dotglob option.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
Il y a aussi le GLOBIGNORE plus flexible variable, que vous pouvez définir sur une liste séparée par deux-points de modèles génériques à ignorer. Si non défini (paramètre par défaut), le shell se comporte comme si la valeur était vide if dotglob est défini, et comme si la valeur était .* si l'option n'est pas définie. Voir Extension de nom de fichier dans le manuel. Les répertoires pervasifs . et .. sont toujours omis, à moins que le . correspond explicitement au motif.
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
Ksh93
Définissez le FIGNORE variable. S'il n'est pas défini (paramètre par défaut), le shell se comporte comme si la valeur était .* . Pour ignorer . et .. , ils doivent être mis en correspondance explicitement (le manuel dans ksh 93s+ 2008-01-31 indique que . et .. sont toujours ignorés, mais cela ne décrit pas correctement le comportement réel).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
Vous pouvez inclure des fichiers de points dans un modèle en les faisant correspondre explicitement.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
Pour que l'expansion sorte vide si le répertoire est vide, utilisez le N option de correspondance de modèle :~(N)@(*|.[^.]*|..?*) ou ~(N:*|.[^.]*|..?*) .
Zsh
Définissez le dot_glob option.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
. et .. ne correspondent jamais, même si le modèle correspond au premier . explicitement.
% echo .*
..two .one
Vous pouvez inclure des fichiers de points dans un modèle spécifique avec le D qualificateur global.
% echo *(D)
..two .one none zero
Ajouter le N qualificatif glob pour que l'expansion sorte vide dans un répertoire vide :*(DN) .
Remarque :vous pouvez obtenir des résultats d'extension de nom de fichier dans différents ordres
(par exemple, none suivi de .one suivi de ..two )
en fonction de vos paramètres du LC_COLLATE , LC_ALL , et LANG variable.