¿Cómo mover varios archivos a la vez a un directorio de destino específico?

152

Tengo un montón de archivos en algún directorio (junto con muchos otros archivos) que quiero mover.

Afortunadamente, todos los archivos que quiero mover contienen un cierto identificador en sus nombres, por lo que puedo ls | grep IDENTIFIERobtener la lista exacta de archivos para mover.

Pero, ¿cómo puedo ejecutar mv file /path/to/dest/folder/de una vez, y no uno por uno (hay muchos archivos para mover)?

gilad hoch
fuente

Respuestas:

100

Si quieres moverte ABC-IDENTIFIER-XYZ.exto IDENTIFIER-XYZ.xmlpuedes usar:

mv *IDENTIFIER* ~/YourPath/

*es un comodín para cero o más caracteres , esto significa cero o más caracteres , seguido de IDENTIFIER, seguido de cero o más caracteres .

Esto moverá todos los archivos que contienen el IDENTIFIERque especificó.

Evandro Silva
fuente
201

Podrías usar

mv -t DESTINATION file1 file2 file3

y

mv -t DESTINATION `ls|grep IDENTIFIER`

funciona, pero no estoy seguro de si mv se invoca varias veces o no, ya que grep generará una nueva línea para cada coincidencia.

tuomaz
fuente
55
funciona en Linux, no estoy seguro de si funcionará en Mac
Alexander Mills
3
funciona en mac y git bash a través de git para windwows.
Brandt Solovij
11
No funciona en Mac (10.11.16 El Capitan). Pero simplemente puede poner la carpeta de destino en la parte posterior, es decirmv file1 file2 ... destination
Sheljohn
2
-1 para el segundo enfoque, ya que caerá para archivos que incluyen nuevas líneas
αғsнιη
24

Puedes usar comodines .

Ejemplo: para mover todos los archivos con extensión .doc

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

Esto moverá todos los archivos de documentos del directorio actual al destino específico.

Editar

Para responder el comentario.

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

Achu
fuente
2
pero la lista de archivos para mover no está determinada por extensión. algunos de los archivos tienen nombre: ABC-IDENTIFIER-XYZ.exty algunos simplemente IDENTIFIER-XYZ.exttienen diferentes extensiones, en su mayoría xmlo properties.
gilad hoch
@giladhoch ¿Qué tal el editado?
Achu
@gliadhoch Si te sientes tan cómodo usando grep, puedes ver mi respuesta arriba / abajo.
encender
no funcionará ya que hay otros .xmlarchivos (por ejemplo) que no quiero mover.
gilad hoch
20

En caso de que desee mover un conjunto de archivos irrelevantes (no hay un patrón común en los nombres y tipos), puede hacer lo que dijo el Sr. Rajanand: primero vaya al directorio que contiene los archivos que desea mover

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

En caso de que los archivos estén dispersos en diferentes directorios, solo necesita especificar la ruta para cada archivo en el comando mover

Ismail AL-taharwa
fuente
10

Utilizo la técnica de tuomaz, pero ligeramente modificada:

mv file1 file2 file3 -t DESTINATION

Encuentro esto más fácil de recordar y más difícil de arruinar, ya que utiliza el mismo orden que la operación mv de vainilla:

mv file1 DESTINATION
Blake Frederick
fuente
La página del manual para mvno menciona una -topción.
Noumenon
2
linux.die.net/man/1/mv sí lo hace
geoyws
7

Usa este comando:

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

Sin embargo, ls no se recomienda para este tipo de uso. Use el comando find en su lugar.

encender
fuente
8
lsNo se recomienda para este tipo de uso. Si desea enumerar archivos, especialmente con un grepreverso, úselo find . -name \*IDENTIFIER\*.
NorTicUs
Esta respuesta fue solo para demostrar cómo puede usar la salida del comando anterior en mv. Como se mencionó ls | grep en la pregunta, simplemente lo copié.
encender
3
Según lo indicado por @NorTicUs, el uso de ls no es aconsejable. Además, los archivos con espacios pueden causar un problema.
Paddy Landau
5

Si tiene tantos archivos para mover, puede tener demasiados para el mvcomando (u otros comandos como rm). Sugiero usar xargspara mover cada archivo individualmente en un bucle como la moda. Una forma de evitar eso es hacer:

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

El ls -1(menos uno) asegura que solo haya un nombre de archivo en cada línea. Si tiene alias ocultos para el lscomando, puede tener varios nombres de archivo en una sola línea y mover inadvertidamente un archivo que no tenía la intención de mover.

AggieBill
fuente
Esto también es útil cuando su IDENTIFICADOR no se convierte fácilmente en un comodín, o si desea utilizar grep con una expresión regular más compleja.
AggieBill
1
+1 para xargs. encontrar es casi siempre mejor y más seguro que ls. encontrar . IDENTIFICADOR -exec mv {} / ruta / a / dest / folder \; (código no probado). es para el directorio de trabajo actual. Los \; es finalizar el comando a ejecutar. Dependiendo de lo que esté haciendo, es posible que deba agregar -maxdepth 1 para evitar que vuelva a aparecer en subdirectorios.
Joe
5

Si los archivos están en el mismo directorio, puede usar

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

(probado en Ubuntu 16.04)

Sruli
fuente
1
Esto realmente no agrega algo a las respuestas existentes, ¿no crees?
postre
1
simplemente elimina la necesidad de especificar la ruta completa al directorio para cada archivo
Sruli
3
find -type f -name "[range]" -exec mv {} target-directory ';'

Este comando moverá los nombres de archivo con cualquier patrón / rango al directorio de destino.

p.ej.

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

moverá archivos con nombres como file1, file2... file50000a target-directory.

usuario734124
fuente
2

Puede usar la salida de ls para ingresar en mv commnad

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

El comando en medio $()devuelve una lista de los nombres de archivo que coinciden con su búsqueda, y eso se puede proporcionar como un parámetro para el comando mv.

Fuad Saud
fuente
1
no analizarls
Zanna
1

Usando este comando puedes mover múltiples archivos.

mv SourceFilenames ~DestinationPath

Rajanand
fuente
1

La forma más fácil es así

mv {file1,file2,file3} DESTINATION

o directorio

mv {directory1,directory2,directory3} DESTINATION

o ambos archivos y directorios

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

Espero que esto ayude

Sabrina
fuente