137 votes

Comment déplacer tous les fichiers du répertoire actuel vers le répertoire supérieur ?

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.

212voto

terry1769 Points 850

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 .


Pourquoi .[^.]* 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 .

48voto

Paggas Points 784

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 * .[^.] .??* .. ¡!

14voto

Thej Points 655

Pour être complet, on peut aussi demander au Shell de Bash d'inclure les fichiers cachés, en utilisant shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob

9voto

Micky Martin Points 91

Le mv ne dispose pas de la fonctionnalité de déplacement des fichiers cachés lorsqu'il utilise * - alors pourquoi ne pas utiliser la copie à la place ?

cp -rf . ..

rm -rf *

Il n'est pas nécessaire d'entrer dans des solutions complexes de dotglobbing et d'utilisation des commandes find.

7voto

mrucci Points 9408
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.

SistemesEz.com

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.

Powered by:

X