Comment déplacer plusieurs fichiers à la fois vers un répertoire de destination spécifique?

152

J'ai un tas de fichiers dans un répertoire (avec beaucoup d'autres fichiers) que je veux déplacer.

Heureusement, tous les fichiers que je veux déplacer contiennent un certain identifiant dans leurs noms, ce qui me permet ls | grep IDENTIFIERd'obtenir la liste exacte des fichiers à déplacer.

Mais, comment puis-je exécuter mv file /path/to/dest/folder/à la fois, et pas un par un (il y a beaucoup de fichiers à déplacer)?

Gil Hoch
la source

Réponses:

101

Si vous souhaitez déménager ABC-IDENTIFIER-XYZ.extou IDENTIFIER-XYZ.xml, vous pouvez utiliser:

mv *IDENTIFIER* ~/YourPath/

*est un caractère générique pour zéro caractère ou plus , cela signifie zéro caractère ou plus , suivi de IDENTIFIER, suivi de zéro caractère ou plus .

Cela déplacera tous les fichiers contenant le fichier IDENTIFIERspécifié.

Evandro Silva
la source
201

Vous pourriez utiliser

mv -t DESTINATION file1 file2 file3

et

mv -t DESTINATION `ls|grep IDENTIFIER`

fonctionne, mais je ne suis pas sûr que mv soit invoqué plusieurs fois ou non, car grep générera une nouvelle ligne pour chaque correspondance.

tuomaz
la source
5
fonctionne sur linux, je ne sais pas s'il fonctionnera sous mac
Alexander Mills
3
fonctionne sur mac et git bash via git pour windows.
Brandt Solovij
11
Ne fonctionne pas sur Mac (10.11.16 El Capitan). Mais vous pouvez simplement mettre le dossier cible à l'arrière, c'estmv file1 file2 ... destination
Sheljohn le
2
-1 pour la deuxième approche car il tombera pour les fichiers comprenant de nouvelles lignes
αsнιη le
24

Vous pouvez utiliser des caractères génériques .

Exemple: pour déplacer tous les fichiers ayant l'extension .doc

mv *.doc /path/to/dest/folder/

Cela déplacera tous les fichiers doc du répertoire actuel vers la destination spécifique.

Modifier

Pour répondre au commentaire.

mv *.ext *.xml *.txt /path/to/dest/folder/

Achu
la source
2
mais la liste des fichiers à déplacer n'est pas déterminée par extension. certains fichiers sont nommés: ABC-IDENTIFIER-XYZ.extet certains ont IDENTIFIER-XYZ.exttous des extensions différentes, principalement xmlou properties.
Gil Hoch
@giladhoch Qu'en est-il de l'édition?
Achu
@gliadhoch Si vous êtes si à l'aise avec grep, vous pouvez voir ma réponse ci-dessus / ci-dessous.
enflammer
ne fonctionnera pas car il y a d'autres .xmlfichiers (par exemple), je ne veux pas bouger.
gilad hoch
20

Si vous souhaitez déplacer un ensemble de fichiers non pertinents (pas de motif commun dans les noms et les types), vous pouvez procéder comme M. Rajanand l’a dit: commencez par aller dans le répertoire qui contient les fichiers que vous souhaitez déplacer.

mv file1.ext1 file2.ext2 file3.ext3.. /destination/

Si les fichiers sont dispersés dans des répertoires différents, il vous suffit de spécifier le chemin d'accès de chaque fichier dans la commande de déplacement.

Ismail AL-taharwa
la source
10

J'utilise la technique de tuomaz, mais légèrement modifiée:

mv file1 file2 file3 -t DESTINATION

Je trouve cela plus facile à retenir et plus difficile à bousiller car il utilise le même ordre que l'opération vanilla mv:

mv file1 DESTINATION
Blake Frederick
la source
La page de manuel pour mvne mentionne aucune -toption.
Noumenon
2
linux.die.net/man/1/mv oui c'est le cas
geoyws
7

Utilisez cette commande:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  

Cependant, ls n’est pas recommandé pour ce type d’utilisation. Utilisez la commande find à la place.

enflammer
la source
8
lsn'est pas recommandé pour ce type d'utilisation. Si vous voulez lister les fichiers, surtout avec un grepretard, utilisez find . -name \*IDENTIFIER\*.
NorTicUs
Cette réponse visait simplement à montrer comment vous pouvez utiliser le résultat de la commande précédente dans mv. Comme ls | grep a été mentionné dans la question, je l'ai simplement copié.
enflammer
3
Comme indiqué par @NorTicUs, l'utilisation de ls est mal avisée. En outre, les fichiers avec des espaces peuvent poser un problème.
Paddy Landau
5

Si vous avez autant de fichiers à déplacer, vous pouvez en avoir trop pour la mvcommande (ou d'autres commandes similaires rm). Je suggère d'utiliser xargspour déplacer chaque fichier individuellement dans une boucle comme à la mode. Une façon de se déplacer est de faire:

ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/

Le ls -1(moins un) garantit qu’il n’ya qu’un seul nom de fichier sur chaque ligne. Si vous avez masqué des alias pour la lscommande, vous pouvez avoir plusieurs noms de fichiers sur une seule ligne et déplacer par inadvertance un fichier que vous n'aviez pas l'intention de déplacer.

AggieBill
la source
Ceci est également utile lorsque votre IDENTIFIANT n'est pas facilement converti en un caractère générique, ou si vous souhaitez utiliser grep avec une expression rationnelle plus complexe.
AggieBill
1
+1 pour xargs. est presque toujours meilleur et plus sûr que ls. trouver . IDENTIFIANT -exec mv {} / chemin / vers / dest / dossier \; (code non testé) Le. est pour le répertoire de travail actuel. Le \; est de mettre fin à la commande à exécuter. En fonction de ce que vous faites, vous devrez peut-être ajouter -maxdepth 1 pour l'empêcher de revenir dans les sous-répertoires.
Joe
5

Si les fichiers sont dans le même répertoire, vous pouvez utiliser

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/

(testé dans Ubuntu 16.04)

Sruli
la source
1
Cela n'ajoute pas vraiment quelque chose aux réponses existantes, vous ne pensez pas?
dessert
1
élimine simplement le besoin de spécifier le chemin complet du répertoire vers chaque fichier
Sruli
3
find -type f -name "[range]" -exec mv {} target-directory ';'

cette commande déplacera les noms de fichiers avec n'importe quel motif / plage dans le répertoire cible.

par exemple.

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'

il déplacera des fichiers avec des noms comme file1, file2... file50000vers target-directory.

utilisateur734124
la source
2

Vous pouvez utiliser la sortie de ls pour entrer dans mv commnad

mv $(ls | grep IDENTIFIER) /path/to/dest/dir

La commande entre $()renvoie une liste des noms de fichier correspondant à votre recherche, qui peut être fournie en tant que paramètre pour la commande mv.

Fuad Saud
la source
1

En utilisant cette commande, vous pouvez déplacer plusieurs fichiers.

mv SourceFilenames ~DestinationPath

Rajanand
la source
1

Le moyen le plus simple est comme ça

mv {file1,file2,file3} DESTINATION

ou répertoire

mv {directory1,directory2,directory3} DESTINATION

ou les deux fichiers et répertoires

mv {file1,file2,file3,directory1,directory2,directory3} DESTINATION

J'espère que cela t'aides

Sabrina
la source