Komut satırındaki bir dizi dosyayı kopyalama (ZSH / BASH)


13

Sonek olarak ardışık sayılar içeren dosyaların bir listesi var. Bu dosyaların yalnızca bir kısmını kopyalamak istiyorum. Cp komutumun bir parçası olarak bir aralığı nasıl belirtebilirim?

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

Ben P1080275.JPG P1080283.JPG için benzer bir şey ile dosyaları kopyalamak istiyorum:

$cp P10802[75-83].JPG ~/Images/.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


25

Çok yakındınız. Sorunuz neredeyse doğru sözdizimiydi:

cp P10802{75..83}.JPG ~/Images

9

Bash aralığında bir aralığı yinelemek için:

for x in {0..10}; do echo $x; done

Aynısını davanıza uygulamak:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done

Bu işe yarıyor, ancak @glenn jackman'ın cevabını daha iyi seviyorum çünkü herhangi bir programlama yapısını çağırmıyor.
Mart'ta Amjith

4

Genişletilmiş glob seçeneği ile Zsh, globbing (desen eşleştirme) operatörüne sahiptir.

setopt extendedglob
echo P10802<75-83>.JPG

geçerli dizindeki bu kalıpla eşleşen dosya adlarıyla eşleşecektir (P1080275.JPG'nin eşleşmesine dikkat edin, ancak P108020000000075.JPG'ye de uymalıdır)

Diğer tarafta, {x ... y} dize genişletme operatörü (zsh ve bash ve ksh93'ın son sürümleri tarafından desteklenir), geçerli dizinde hangi dosyaların bulunduğuna bakılmaksızın x'ten y'ye kadar dizelere genişler.

cp P10802<75-83>.JPG ~there

eşleşen dosyaları kopyalar,

cp P10802{75..83}.JPG ~there

Ancak, örneğin P1080281.JPG mevcut değilse hata alırsınız.


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.