Birden fazla dosyayı aynı anda belirli bir hedef dizine nasıl taşırım?


152

Taşımak istediğim bazı dizinlerde (diğer birçok dosyayla birlikte) bir sürü dosyam var.

Neyse ki, taşımak istediğim tüm dosyalar adlarında belirli bir tanımlayıcı içeriyor, böylece ls | grep IDENTIFIERtaşınacak dosyaların tam listesini bulabilirim.

Ancak, bir mv file /path/to/dest/folder/kerede nasıl tek tek yürütebilirim (tek tek değil (taşınacak çok fazla dosya var)?)?

Yanıtlar:


100

Taşımak istiyorsanız ABC-IDENTIFIER-XYZ.extveya IDENTIFIER-XYZ.xmlkullanabilirsiniz:

mv *IDENTIFIER* ~/YourPath/

*bir karakteri ise sıfır ya da daha fazla karakter , bunun anlamı sıfır ya da daha fazla karakter , ardından IDENTIFIERtakip sıfır veya daha fazla karakterden .

Bu, tüm dosyaları hareket edecek içerirlerIDENTIFIER belirttiğiniz.


201

Kullanabilirsin

mv -t DESTINATION file1 file2 file3

ve

mv -t DESTINATION `ls|grep IDENTIFIER`

çalışır, ancak mv'nin birden çok kez çağrılıp başlatılmadığından emin değilim, grep her eşleşme için yeni bir satır çıkaracaktır.


5
linux üzerinde çalışıyor, mac üzerinde çalışıp çalışmadığından emin değil
Alexander Mills

3
rüzgarlar için git üzerinden mac ve git bash üzerinde çalışır.
Brandt Solovij

11
Mac üzerinde çalışmıyor (10.11.16 El Capitan). Fakat hedef klasörü basitçe arkaya yerleştirebilirsiniz, yanimv file1 file2 ... destination
Sheljohn

2
-1 yeni
αғsнιη


24

Joker karakterleri kullanabilirsiniz .

Örnek: .doc uzantılı tüm dosyaları taşımak için

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

Bu, geçerli dizin altındaki tüm doc dosyalarını belirli bir hedefe taşıyacaktır.

Düzenle

Yoruma cevap vermek için.

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


2
ancak taşınacak dosyaların listesi uzantı tarafından belirlenmedi. dosyalardan bazıları adlandırılmıştır: ABC-IDENTIFIER-XYZ.extve bazılarının IDENTIFIER-XYZ.extçoğu, çoğunlukla xmlveya farklı uzantılara sahiptir properties.
gilad hoch

@giladhoch Düzenlenen hakkında nasıl?
Achu

@gliadhoch Grep kullanmakta çok rahatsanız, cevabımı yukarıda / altında görebilirsiniz.
ateşlemek

Başka .xmldosyalar olduğu için çalışmayacak (örneğin) taşımak istemiyorum.
gilad hoch

20

Bir dizi ilgisiz dosyayı taşımak istediğinizde (isimler ve türlerde ortak bir kalıp yoksa) Mr. Rajanand'ın dediği gibi yapabilirsiniz: İlk önce taşımak istediğiniz dosyaları içeren dizine gidin.

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

Dosyaların farklı dizinlere dağılması durumunda, her bir dosya için taşıma komutunda yolu belirtmeniz gerekir.


10

Tuomaz'ın tekniğini kullanıyorum ama biraz değiştirdim:

mv file1 file2 file3 -t DESTINATION

Vanilya mv operasyonu ile aynı sıralamayı kullandığı için bunu hatırlaması ve vidalaması daha zor buluyorum:

mv file1 DESTINATION

İçin man sayfası mvbir -tseçenekten bahsetmiyor .
Noumenon


7

Bu komutu kullanın:

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

Ancak, bu tür bir kullanım için bu tavsiye edilmez. Kullan bulmak yerine komutu.


8
lsbu tür bir kullanım için önerilmez. Dosyaları, özellikle greparkasından listelemek istiyorsanız kullanın find . -name \*IDENTIFIER\*.
NorTicU'lar

Bu cevap sadece önceki komutun çıktısını mv olarak nasıl kullanabileceğinizi göstermekti. Soruda ls | grep'den bahsedildiği gibi, sadece kopyaladım.
ateşlemek

3
@NorTicUs tarafından belirtildiği gibi, ls kullanımı tavsiye edilmez. Ayrıca, boşluk içeren dosyalar bir soruna neden olabilir.
Paddy Landau


5

Taşınacak çok fazla dosyanız varsa, aslında mvkomut için (veya benzeri komutlar için) çok fazla olabilir rm. xargsHer dosyayı tek tek modaya uygun bir döngüde taşımak için kullanmanızı öneririm . Bunu aşmanın bir yolu yapmaktır:

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

ls -1(Eksi bir) her satırda sadece bir dosya adı olduğunu garanti eder. lsKomut için gizli takma adlarınız varsa, tek bir satırda birden fazla dosya adına sahip olabilir ve yanlışlıkla taşımak istemediğiniz bir dosyayı yanlışlıkla taşıyabilirsiniz.


Bu aynı zamanda IDENTIFIER'niz kolayca bir joker karaktere dönüştürülmediğinde veya grep'i daha karmaşık bir regex ile kullanmak istediğinizde kullanışlıdır.
AggieBill

1
Xargs için +1. bulmak neredeyse her zaman ls'den daha iyi ve güvenlidir. Bul TANIMLAMA -exec mv {} / yol / to / dest / klasör \; (denenmemiş kod). geçerli çalışma dizini içindir. \; yürütülecek komutu sonlandırmak içindir. Yaptığınız şeye bağlı olarak, alt dizinlere yinelenmesini önlemek için bir -maksımcı 1 eklemeniz gerekebilir.
Joe

5

Dosyalar aynı dizinde ise kullanabilirsiniz

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

(Ubuntu 16.04’de test edilmiştir)


1
Bu gerçekten mevcut cevaplara bir şey eklemiyor, sence de öyle değil mi?
tatlı

1
her dosya için dir için tam yol belirtme gereksinimini ortadan kaldırır
Sruli

3
find -type f -name "[range]" -exec mv {} target-directory ';'

bu komut dosya adlarını herhangi bir desen / aralık ile hedef dizine taşıyacaktır.

Örneğin.

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

o gibi isimlerle dosyaları hareket edecek file1, file2... file50000için target-directory.


2

Ms commnad'a giriş yapmak için ls'den çıkış kullanabilirsiniz.

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

Aradaki komut $(), aramanızla eşleşen ve mv komutu için bir parametre olarak sağlanabilecek dosya adlarının bir listesini döndürür.



1

Bu komutu kullanarak birden fazla dosyayı taşıyabilirsiniz.

mv SourceFilenames ~DestinationPath


1

En kolay yol böyle

mv {file1,file2,file3} DESTINATION

veya dizin

mv {directory1,directory2,directory3} DESTINATION

veya hem dosyalar hem de dizinler

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

Bu yardımcı olur umarım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.