Como mover vários arquivos de uma vez para um diretório de destino específico?

152

Eu tenho vários arquivos em algum diretório (junto com muitos outros arquivos) que quero mover.

Felizmente, todos os arquivos que quero mover contêm um determinado identificador em seus nomes, para que eu possa ls | grep IDENTIFIERobter a lista exata de arquivos a serem movidos.

Mas como posso executar de mv file /path/to/dest/folder/uma só vez, e não um por um (há muitos arquivos para mover)?

Gilad Hoch
fonte

Respostas:

100

Se você deseja mover ABC-IDENTIFIER-XYZ.extou IDENTIFIER-XYZ.xml, pode usar:

mv *IDENTIFIER* ~/YourPath/

*é um curinga para zero ou mais caracteres , significa zero ou mais caracteres , seguido por IDENTIFIER, seguido por zero ou mais caracteres .

Isso moverá todos os arquivos que contêm o que IDENTIFIERvocê especificou.

Evandro Silva
fonte
201

Você poderia usar

mv -t DESTINATION file1 file2 file3

e

mv -t DESTINATION `ls|grep IDENTIFIER`

funciona, mas não tenho certeza se mv é chamado várias vezes ou não, pois o grep produzirá uma nova linha para cada correspondência.

tuomaz
fonte
5
funciona em Linux, não tenho certeza se ele vai trabalhar no mac
Alexander Mills
3
funciona no mac e git bash via git para windwows.
Brandt Solovij 23/02
11
Não funciona no Mac (10.11.16 El Capitan). Mas você pode simplesmente colocar a pasta de destino na parte de trás, ou seja,mv file1 file2 ... destination
Sheljohn
2
-1 para a segunda abordagem, pois cairá para arquivos que incluem novas linhas
αғsнιη
24

Você pode usar curingas .

Exemplo: Para mover todos os arquivos com extensão .doc

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

Isso moverá todo o arquivo doc no diretório atual para o destino específico.

Editar

Para responder ao comentário.

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

Achu
fonte
2
mas a lista de arquivos a serem movidos não é determinada por extensão. alguns dos arquivos são nomeados: ABC-IDENTIFIER-XYZ.exte alguns IDENTIFIER-XYZ.exttêm extensões diferentes, principalmente xmlou properties.
gilad hoch
@giladhoch Que tal o editado?
Achu
@gliadhoch Se você está tão confortável com o grep, pode ver minha resposta acima / abaixo.
Ignite
não funcionará, pois existem outros .xmlarquivos (por exemplo) que eu não quero mover.
gilad hoch
20

Caso deseje mover um conjunto de arquivos irrelevantes (sem padrão comum nos nomes e tipos), você pode fazer o que o Sr. Rajanand disse: primeiro, vá para o diretório que contém os arquivos que deseja mover

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

Caso os arquivos estejam espalhados em diretórios diferentes, você só precisará especificar o caminho para cada arquivo no comando move

Ismail AL-taharwa
fonte
10

Eu uso a técnica de tuomaz, mas ligeiramente modificada:

mv file1 file2 file3 -t DESTINATION

Acho isso mais fácil de lembrar e mais difícil de estragar, pois usa a mesma ordem da operação vanilla mv:

mv file1 DESTINATION
Blake Frederick
fonte
A página de manual para mvnão menciona uma -topção.
Noumenon
2
linux.die.net/man/1/mv sim, é #
geoyws
7

Use este comando:

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

No entanto, ls não é recomendado para esse tipo de uso. Use o comando find em seu lugar.

inflamar
fonte
8
lsnão é recomendado para esse tipo de uso. Se você deseja listar arquivos, especialmente com um grepbehind, use find . -name \*IDENTIFIER\*.
precisa saber é o seguinte
Esta resposta foi apenas para demonstrar como você pode usar a saída do comando anterior no mv. Como ls | grep foi mencionado na pergunta, eu apenas o copiei.
Ignite
3
Conforme afirmado por @NorTicUs, o uso de ls é desaconselhável. Além disso, arquivos com espaços podem causar um problema.
Paddy Landau
5

Se você tiver tantos arquivos para mover, poderá ter muitos para o mvcomando (ou outros comandos como rm). Sugiro usar xargspara mover cada arquivo individualmente em um loop como moda. Uma maneira de contornar isso é:

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

O ls -1(menos um) garante que haja apenas um nome de arquivo em cada linha. Se você tiver aliases ocultos para o lscomando, poderá ter vários nomes de arquivos em uma única linha e mover inadvertidamente um arquivo que não pretendia mover.

AggieBill
fonte
Isso também é útil quando o seu IDENTIFIER não é facilmente transformado em um curinga ou você deseja usar o grep com um regex mais complexo.
AggieBill
1
+1 para xargs. encontrar é quase sempre melhor e mais seguro do que sl. encontrar . IDENTIFIER -exec mv {} / caminho / para / dest / pasta \; (código não testado). é para o diretório de trabalho atual. O \; é finalizar o comando a ser executado. Dependendo do que você está fazendo, talvez seja necessário adicionar um -maxdepth 1 para impedir que ele se repita em subdiretórios.
21412 Joe
5

Se os arquivos estiverem no mesmo diretório, você poderá usar

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

(testado no Ubuntu 16.04)

Sruli
fonte
1
Isso realmente não adiciona algo às respostas existentes, você não acha?
dessert
1
apenas elimina a necessidade de especificar o caminho completo para dir para cada arquivo
Sruli
3
find -type f -name "[range]" -exec mv {} target-directory ';'

este comando moverá nomes de arquivos com qualquer padrão / intervalo para o diretório de destino.

por exemplo.

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

ele moverá arquivos com nomes como file1, file2... file50000para target-directory.

user734124
fonte
2

Você pode usar a saída de ls para inserir no mv commnad

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

O comando between $()retorna uma lista dos nomes de arquivos correspondentes à sua pesquisa e que podem ser fornecidos como parâmetro para o comando mv.

Fuad Saud
fonte
1
Não analisels
Zanna
1

Usando este comando, você pode mover vários arquivos.

mv SourceFilenames ~DestinationPath

Rajanand
fonte
1

A maneira mais fácil é assim

mv {file1,file2,file3} DESTINATION

ou diretório

mv {directory1,directory2,directory3} DESTINATION

ou ambos os arquivos e diretórios

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

Espero que isto ajude

Sabrina
fonte