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.