Déplacer le contenu du dossier d'un niveau


127

J'ai un répertoire qui est décompressé, mais est dans un dossier. Comment puis-je déplacer le contenu d'un niveau? J'accède à CentOS via SSH.

Réponses:


189

Avec le dossier appelé 'myfolder' et un niveau supérieur dans la hiérarchie des fichiers (le point que vous voulez placer), la commande serait:

mv myfolder/* .

Ainsi , par exemple si les données était /home/myuser/myfolderalors de /home/myuser/lancer la commande.


35
Vous devrez peut-être également faire correspondre .*non seulement *si l'archive contient des fichiers de points. Ajoutez également `&& rmdir myfolder` à la fin pour supprimer le dossier désormais inutile. Ceci est sauvegardé car il ne sera exécuté que si le fichier mv renvoie succès ET car rmdir ne supprimera pas un répertoire non vide.
Caleb

Bon point sur le .*. Supprimer le dossier original est à la fois trivial et non demandé, nous allons donc laisser OP s'occuper de cela lui-même.
Rudu

1
@Caleb est-il possible d'écrire les deux *et .*sur une ligne? rien que de la curiosité
Richard

2
@ Richard Oui, c'est ça. Les arguments de mvseront tous des sources sauf l'argument LAST qui doit être la cible du déplacement (et dans le cas de plusieurs sources, il doit s'agir d'un dossier).
Caleb

1
Je commence à avoir:/bin/mv: Argument list too long
dragosrsupercool

26

Pour que tout soit clair, tiré de la réponse de Rudu ci-dessus et des commentaires.

Si vous devez déplacer tout le contenu, INCLUANT les fichiers qui commencent par un. (comme .htaccess, .git, etc.), vous devez inclure à la fois * et. * dans votre commande. Ainsi:

 mv subfolder/* subfolder/.* .

Cela déplacera le contenu du sous-dossier dans votre dossier actuel. Notez l'espace avant le dernier ".".


ça marche mais je reçois mv: rename fake/. to ./.: Invalid argumentetmv: rename fake/.. to ./..: Invalid argument
Maslow

16

Ceci est possible avec les méthodes suivantes:

  • Utilisant rsync:

    rsync -vua --delete-after foo/ .
  • Utiliser cpet rmdir:

    cp -vaR foo/. . && rmdir foo/
  • Utiliser mv(avec l' dotgloboption activée):

    shopt -s dotglob # Includes filenames beginning with a dot.
    mv -- foo/* .    # Where foo/ is the folder consisting the files.
    shopt -u dotglob # Disables previously enabled dotglob option.

    foo/est votre dossier dont le contenu doit être déplacé d'un niveau supérieur.

    Voir: help shoptet man bash.

  • Utilisation mv(comme suggéré ici ):

    mv foo/* foo/.[^.]* . && rmdir foo/

    Remarque: il manquerait un fichier appelé foo/..bar...

    Remarque: Pour les shells POSIX, vous avez besoin de [!.].


Quels sont les commutateurs rsync -v, -u, -aet -rfaire? AFAICT, -vest commenté, ce qui fait que rsync imprime plus d'informations. -usignifie mettre à jour - ne copiez un fichier que s'il est plus récent. Cela ne semble pas pertinent. -asignifie archives. Cela copiera le propriétaire et les autorisations du fichier et rendra la synchronisation récursive. -rsignifie récursif, mais c'est déjà couvert par -a.
rjmunro

-uest utile lorsque vous ne voulez pas passer plus de temps à déplacer des données déjà présentes (en particulier pour les périphériques de stockage lents). J'ai enlevé -r, car c'est couvert par -acomme vous l'avez mentionné.
Kenorb

1
mv foo/* foo/.[^.]* .manquerait un fichier appelé foo/..bar..par exemple. Notez que pour les shells POSIX, il vous faut [!.].
Stéphane Chazelas

Il convient de mentionner que cela rsync -vua --delete-after foo/ .supprime tout ce qui pourrait déjà exister dans le répertoire en cours.
David

7

il suffit d'émettre une commande mv

mv (directory)/* .

si vous voulez supprimer le répertoire puis ajoutez

rm -rf (directory)

Supposé que vous êtes dans un répertoire parent de (répertoire)

Si vous êtes dans le (répertoire) alors

mv * ../

13
Conseil de sécurité supplémentaire: lorsque vous supprimez un répertoire dont vous savez qu'il devrait être vide, il se rmdirplaint et se ferme si le répertoire n'est pas vide, alors qu'il l' rm -raurait simplement supprimé ainsi que tout son contenu. (C'est un poka-yoke .)
Anko

Excellent point! Je ne peux pas penser à une raison pour ne pas le faire de cette façon.
Mark Lalor

@ MarkLalor Une des raisons pourrait être la présence de fichiers cachés, comme l'omniprésent .DS_storedans macOS. La mvcommande ci-dessus ne déplacera pas ceux-ci (sans dotglobset).
AkselA

0

pour ceux d'entre vous sur un serveur partagé, vous devriez utiliser quelque chose comme ça

Déplacer les fichiers

mv -v ~/public_html/public_html/* ~/public_html/

Copier les fichiers

cp -a ~/public_html/public_html/* ~/public_html/


2
La question ci-dessus concerne le déplacement sans copier le contenu. Cela dupliquerait les fichiers en laissant les originaux dans un sous-dossier. De plus, être un serveur "partagé" ou pas n'a vraiment rien à voir avec cela.
Caleb

1
à droite et voici la réponse…
Ricardo Havoc

2
Re votre édition: en quoi est-ce différent de la réponse déjà votée ? Et qu'est-ce qu'un "serveur partagé" a à voir avec cela? Veuillez éditer pour expliquer ces éléments si cela va être une contribution utile qui ajoute de la valeur à ce qui est déjà ici.
Caleb

1
Je ne suis pas d'accord sur le fait que le serveur partagé n'a rien à voir avec cela. La façon dont le "dir" est entré fait un monde de différence ..
Ricardo Havoc

1
mec pourquoi tu es tellement en colère? ... wow .. Je partageais juste un peu de connaissance. Nous comprenons tous différemment et faisons face à différents problèmes techniques différemment ... Passez une bonne journée Caleb ..
Ricardo Havoc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.