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.

Blankman
la source
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).

enzotib
la source
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
lockwobr
la source
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.
Jpezz
la source
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.

Demian
la source
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.

Adamcatto
la source