Comment déplacer tous les fichiers du dossier actuel vers un sous-dossier?


70

Je suis sur le chemin:

/myuser/downloads/

Et je crée un sous-dossier:

/myuser/downloads/new

Maintenant, je veux déplacer tous les fichiers et dossiers / sous-dossiers du dossier de téléchargement vers le sous-dossier.

Comment puis-je faire ceci?

J'ai essayé:

mv -R *.* new/

Mais le mouvement ne prend pas le commutateur -R semble-t-il.


4
Vous n'avez pas besoin de -R. Juste mv * newsi, il va gémir "ne peut pas changer de nouveau" ou quelque chose de similaire. Peut-être mv -i * newpour vous empêcher les écrasements.

Réponses:


101

La commande

mv !(new) new

devrait faire l'affaire. Si cela ne fonctionne pas, lancez d' shopt -s extglobabord.

Pour déplacer également les fichiers / répertoires cachés (commençant par un point), lancez-le également en shopt -s dotglobpremier.
Pour résumer:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(il est toujours préférable de se désinstaller dotglobpour éviter les mauvaises surprises).


5
pouvez-vous mentionner quelle est la signification de !(something)?
— Adeerlike

2
@adeer qui dit juste pas (quelque chose). En d'autres termes, copiez tout mais pas quelque chose. Clair comme de la boue?
— RockyMountainHigh

4
très. connaissez-vous l'équivalent de zsh?
— Adeerlike

1
Si je tente de déplacer le contenu du dossier devvers mon emplacement actuel, dois-je exécuter mv !(dev) dev? Je reçois-bash: !: event not found
— Noir

5
@adeer très similaire. setopt extendedglobpour définir le mode étendu étendu dans zsh. ^est le symbole d'exclusion, alors mv ^new newferait l'affaire. ensuite, pour voir toutes les options définies dans zsh, vous pouvez utiliser setoptet pour désactiver le mode global étendu, vous pouvez le faireunsetopt extendedglob
— Mr. T

10

J'ai trouvé quelque chose comme ça mais il est un peu plus simple à comprendre et cela pourrait bien fonctionner pour vous aussi:

ls | grep -v new | xargs mv -t new

Ajouter une explication à la solution ci-dessus:

À partir des pages de manuel:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Expliqué par étape:

  • ls listera les fichiers dans le répertoire courant
  • grep -v new reviendra canalisé à qui ne correspond pas à nouveau
  • xargs mv -t newdéplacera les fichiers qui y sont dirigés du grep -vrépertoire cible

J'ai essayé cette méthode mais je reçois: mv: illegal option -- t. Est-ce parce que j'utilise zsh?
— ConstantFun

@ConstantFun Cela pourrait être zsh mais je suppose que c'est votre implémentation de mv(ce qui signifie que votre version de mv est différente de ce que j'utilisais) qu'est-ce que vous utilisez? Je crois que lorsque je l' ai écrit cette réponse que j'étais sur distro linux en centosutilisant bash.
— lockwobr le

2
Je ne fais que tester cela sur osx et j’obtiens la même erreur, mv: illegal option -- tcar mv n’a pas d’ -toption.
— lockwobr le

1
(Je n'ai pas essayé cela et je ne prévois pas.) Ce lien apple.stackexchange.com/questions/69223/… vous explique comment installer gnucore, ce qui devrait vous aider à obtenir des informations de base sur gnu, osx est livré avec bsd Les outils cli qui sont différents de ceux fournis avec linux.
— lockwobr le

Je suis sous OSX zsh, alors c'est probablement le système d'exploitation alors…? Merci de clarifier!
— ConstantFun

7

Idée simple. En supposant que vous êtes dans / myuser , renommer téléchargements à nouveau , créez un nouveau téléchargements répertoire puis déplacez nouveau en elle.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Si vous souhaitez déplacer tous les fichiers d'un dossier vers l'un de ses sous-dossiers, vous pouvez utiliser la commande suivante:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Il trouvera tous les fichiers et les déplacera ensuite dans votre sous-dossier.

@waltinator: ajouté -type d -name 'new' -prunepour empêcher la traversée de /myuser/downloads/new.


J'ai créé un sous-répertoire nommé newet essayé cette commande, je reçois mv: missing file operandetTry 'mv --help' for more information
— mook765

1

Vous pouvez essayer ce processus alternatif –– rester dans le chemin

/myuser/downloads/

mais, au lieu de créer d' abord le /myuser/downloads/new/répertoire, au lieu de créer un dossier dans le /myuser/répertoire, avec la commande mkdir ../new, puis déplacez tous les fichiers downloadsà new, et enfin passer newdans downloads. Vous pouvez le faire en une seule ligne, tandis que dans le /myuser/downloads/chemin, avec la commande:

mkdir ../new && mv * ../new && mv ../new ../downloads

Dans ce cas, vous n'avez pas à vous soucier de toute sorte de « filtrage » des fichiers / dossiers, depuis newest sur le même niveau du chemin que downloads, de sorte que vous pouvez simplement déplacer tout downloadsà new, puis se déplacer newdans downloads`.

Cependant, si vous avez déjà newcréé le sous-dossier et que vous ne voulez pas en créer un autre, ne vous inquiétez pas - changez simplement la mkdircommande située à gauche du premier &&de la commande ci-dessus en une mvcommande, en poussant newvers le haut. chemin; en d'autres termes, pendant que vous êtes toujours dans /myuser/downloads/, vous pouvez changer mkdir ../newpour mv new ... Ensuite, le sous-dossier new[dans le chemin /myuser/downloads/new/] est poussé jusqu'à /myuser/new/, au même niveau que /myuser/downloads/, et vous pouvez ensuite exécuter le reste de la commande comme indiqué ci-dessus. Tous ensemble, nous avons, à partir du chemin /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

et puisque vous vouliez "déplacer tous les fichiers et dossiers / sous-dossiers du dossier de téléchargement vers le sous-dossier [ new]", vous avez terminé! Si vous vouliez déplacer uniquement des fichiers (ou uniquement des dossiers ou [insérer un mouvement d'objet plus granulaire]), vous devrez alors utiliser d'autres commandes permettant de "filtrer" les objets, telles que grep. Les commandes écrites ci-dessus sont cependant suffisantes.

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.