Comment déplacer tous les fichiers du répertoire courant vers le répertoire supérieur sous linux ?
J'ai essayé quelque chose comme mv *.*
mais ça ne marche pas.
Comment déplacer tous les fichiers du répertoire courant vers le répertoire supérieur sous linux ?
J'ai essayé quelque chose comme mv *.*
mais ça ne marche pas.
La commande que vous recherchez est
mv * .[^.]* ..
ou (voir ci-dessous pour plus d'informations) :
(shopt -s dotglob; mv -- * ..)
Explication : le mv
déplace des fichiers et des répertoires. Le dernier argument de la commande mv
est la cible (dans ce cas, le répertoire situé une étape "plus haut" dans l'arbre, ..
). Les arguments qui précèdent sont les fichiers et répertoires sources. L'astérisque ( *
) est un caractère générique qui correspond à tous les fichiers qui ne commencent pas par un point. Les fichiers qui commencent par un point (dotfiles) sont "cachés". Ils sont comparés à l'aide du modèle .[^.]*
(voir l'édition ci-dessous).
Voir la page de manuel que j'ai liée pour plus d'informations sur mv
.
.[^.]*
au lieu de .*
?Comme Chris Johnsen souligne à juste titre : le modèle .*
correspond également à .
y ..
. Comme vous ne voulez pas (et ne pouvez pas) les déplacer, il est préférable d'utiliser un motif qui correspond à tout nom de fichier commençant par un point sauf ces deux-là . Le motif .[^.]*
fait exactement cela : il correspond à tout nom de fichier (1) commençant par un point (2) suivi d'un caractère qui est no un point (3) suivi de zéro ou plusieurs caractères arbitraires.
Comme Paggas souligne nous devrions également ajouter le motif .??*
afin de faire correspondre les fichiers commençant par deux points. Voir sa réponse pour une solution alternative utilisant find
.
Arjan réponse mentionne shopt
afin d'éviter tous ces problèmes avec dotfiles. Mais il y a toujours le problème des fichiers commençant par un tiret. Et cela nécessite trois commandes. Malgré tout, j'aime l'idée. Je propose de l'utiliser comme ceci :
(shopt -s dotglob; mv -- * ..)
Ceci exécute shopt
dans une sous-couche (donc pas de deuxième appel à shopt
nécessaire) et utilise --
afin que les fichiers commençant par un tiret ne soient pas interprétés comme des arguments à mv
.
Réponse courte : utiliser
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Longue réponse :
La commande
mv * .* ..
ne fonctionnera pas puisque .*
peut correspondre .
y ..
. Mais la commande
mv * .[^.]* ..
ne fonctionnera pas non plus, puisque .[^.]*
ne correspondront pas, par exemple, ..filename
! Au lieu de cela, ce que je fais est
mv * .[^.] .??* ..
qui correspondra à tout sauf .
y ..
. *
correspondra à tout ce qui ne commence pas par un .
, .[^.]
correspondra à tous les noms de fichiers de 2 caractères commençant par un point, sauf ..
y .??*
correspondra à tous les noms de fichiers commençant par un point et comportant au moins 3 caractères.
Mieux encore, vous pouvez utiliser
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
ce qui évite les vilaines manipulations globales dans mv * .[^.] .??* ..
¡!
rsync -a --remove-source-files . ..
rsync
est un outil de copie de fichiers extrêmement puissant, généralement utilisé pour effectuer des sauvegardes incrémentielles à distance et des miroirs efficaces.
Avec la commande ci-dessus, nous disons à rsync
pour copier le contenu de .
en ..
L'interrupteur -a
permet la récursion dans .
des sous-répertoires et active certaines autres options courantes.
L'interrupteur --remove-source-files
indique à rsync de supprimer les fichiers sources après une copie réussie, c'est-à-dire qu'il fait en sorte que rsync se comporte de la même manière que l'option mv
commandement.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.