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)?

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.


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.


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/


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


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

A página de manual para mvnão menciona uma -topção.
Noumenon


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.


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.


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)


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.


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.



1

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

mv SourceFilenames ~DestinationPath


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.