Birden fazla uzantıya sahip dosyaları kopyalama


22

Birden fazla uzantıya sahip dosyaları tek bir hedef dizine kopyalamak istiyorum.

Örneğin , çalışma dizinindeki tüm .txt dosyalarını adı verilen bir dizine kopyalamak için aşağıdaki komutu kullanabilirim destination:

cp -v *.txt destination/

Ve çalışma dizinindeki tüm .png dizinlerini kopyalamak için aşağıdakileri kullanabilirim destination:

cp -v *.png destination/

Ancak, bunları ayrı komutlar olarak yazmak zaman alıcıdır (komut geçmişi kullanılsa bile). Yani, Söyleyebileceğim bir yolu var mı cpdesen biriyle dosyaları kopyalamak için *.txt ya desen *.pngiçin destination? Talimat gibi - İdeal olarak, ben ikiden fazla desen belirtmek edebilmek istiyorum cptüm kopyalamak *.txt veya *.png veya *.jpg dosya destinationörneğin.

Bunların hepsinin bir kabuk betiği kullanarak mümkün olduğuna eminim - bashörneğin kullanıyorum - ama daha basit, sadece konsoldan başarmanın bir yolu var mı? Bunu yapmak için bir şekilde ayraç genişletme kullanabilir miyim?

Bunun mümkün olduğunu biliyoruz bu eşleştirme kesin olarak belirlenmiş kalıpları hariç çalışan dizindeki tüm dosyaları kopyalamak , ama benim çalışma dizini O kadar fazla dosya uzantıları içerdiğinden yok ben daha kopyalamak istediğiniz yapmak bir ağrı olacağını,.

Bu konuda herhangi bir fikriniz var mı?


10
cp -v *.txt *.png destination/?
iruvar

Yanıtlar:


55

Brace genişlemesi işi halleder. man bashve arayın Brace Expansion.

cp *.{txt,jpg,png} destination/

DÜZENLE:

OP'nin isteğine uygun olarak, yukarıdaki komut ayrıntılı seçeneği eksikti:

cp -v *.{txt,jpg,png} destination/

2
Bunu Windows'ta yapabilir miyim?
sergiol

Yaparsam cp data/images/*.{jpg,jpeg,png,mp4} destination/ve bir mp4dosya yoksa No such file or directory, betiği kıran bir hata alıyorum. Birden fazla uzantıyı eksik formatları incelikle ele alabilir miyim?
BradGreens

1
@BradGreens Yorumlar burada sormak yerine gerçekten yeni bir soru göndermelisiniz. Sorunuzda zaten bir cevap olabilir. Yeni bir soru göndermek sadece bir cevap almakla kalmaz, aynı yardıma ihtiyacı olan başkaları tarafından da aranabilir.
Timothy Martin

0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

Bu çalışıyor!

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.