web-dev-qa-db-fra.com

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

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.

68
Blankman

La commande

mv !(new) new

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

Pour déplacer également les fichiers/répertoires masqués (commençant par un point), exécutez également shopt -s dotglob en premier.
Pour résumer:

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

(il est toujours préférable de désélectionner dotglob pour éviter les mauvaises surprises).

99
enzotib

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 du répertoire courant
  • grep -v new retournera piped à ce qui ne correspond pas new
  • xargs mv -t new déplacera les fichiers qui y sont connectés de grep -v vers le répertoire cible
10
lockwobr

Idée simple. En supposant que vous soyez dans / myuser, renommez téléchargements en nouvea, créez un nouveau répertoire téléchargements puis déplacez nouvea dedans.

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

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

/myuser/downloads/

mais, au lieu de créer d'abord le répertoire /myuser/downloads/new/, créez plutôt un dossier dans le répertoire /myuser/, avec la commande mkdir ../new, puis déplacez tous les fichiers de downloadsvers newet finalement déplacez newnom__ dans downloadsname__. Vous pouvez le faire sur une seule ligne, tandis que vous êtes dans le chemin /myuser/downloads/, à l’aide de la commande suivante:

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

Dans ce cas, vous n'avez pas à vous soucier d'un quelconque "filtrage" des fichiers/dossiers, puisque newse trouve au même niveau du chemin que downloadsname__, vous pouvez donc tout déplacer dans downloadsà newname__, puis déplacer newdans downloads`.

Toutefois, si le sous-dossier newa déjà été créé et que vous ne souhaitez pas en créer un autre, ne vous inquiétez pas, changez simplement la commande mkdirsituée à gauche du premier && dans la commande ci-dessus en une commande mvname__, poussez newdans le chemin; En d'autres termes, tant que vous êtes toujours dans /myuser/downloads/, vous pouvez changer mkdir ../new en 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 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 [newname__]", vous avez terminé! Si vous vouliez déplacer niquement fichiers (ou niquement dossiers ou [insérer un mouvement d'objet plus granulaire]), vous devrez alors utiliser d'autres commandes pouvant "filtrer" objets, tels que grepname__. Les commandes écrites ci-dessus sont cependant suffisantes.

1
adamcatto

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 de -type d -name 'new' -Prune pour empêcher la traversée de /myuser/downloads/new.

1
demian