Salin berbagai file dalam baris perintah (ZSH / BASH)

13

Saya memiliki daftar file dengan angka berurutan sebagai sufiks. Saya ingin menyalin hanya kisaran file-file ini. Bagaimana saya bisa menentukan rentang sebagai bagian dari perintah cp saya.

$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*

Saya ingin menyalin file dari P1080275.JPG ke P1080283.JPG dengan sesuatu yang mirip dengan:

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

Apakah ada cara untuk melakukan ini?

Amjith
sumber

Jawaban:

25

Anda sangat dekat. Pertanyaan Anda hampir merupakan sintaks yang benar:

cp P10802{75..83}.JPG ~/Images
glenn jackman
sumber
9

Untuk beralih di rentang bash:

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

Menerapkan hal yang sama dalam kasus Anda:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
Shyam Sundar CS
sumber
Ini berfungsi, tetapi saya lebih suka jawaban @glenn jackman karena tidak meminta konstruk pemrograman apa pun.
Amjith
4

Zsh, dengan opsi extendedglob memiliki operator globbing (pencocokan pola).

setopt extendedglob
echo P10802<75-83>.JPG

akan cocok dengan nama file di direktori saat ini yang cocok dengan pola itu (berhati-hatilah bahwa P1080275.JPG cocok tetapi begitu juga P108020000000075.JPG)

Di ujung lain, operator ekspansi string {x ... y} (didukung oleh zsh dan versi terbaru dari bash dan ksh93), memperluas ke string dari x ke y, terlepas dari file apa yang ada di direktori saat ini.

cp P10802<75-83>.JPG ~there

akan menyalin file yang cocok, begitu juga

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

Tetapi Anda akan mendapatkan kesalahan jika misalnya P1080281.JPG tidak ada.

sch
sumber
1

Apakah ini bekerja untuk Anda:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
Janne Pikkarainen
sumber