Skopiuj zakres plików w wierszu poleceń (ZSH / BASH)

13

Mam listę plików z kolejnymi liczbami jako sufiksami. Chciałbym skopiować tylko zakres tych plików. Jak mogę określić zakres jako część mojej komendy cp.

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

Chciałbym skopiować pliki z P1080275.JPG do P1080283.JPG z czymś podobnym do:

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

Czy jest na to sposób?

Amjith
źródło

Odpowiedzi:

25

Byłeś bardzo blisko Twoje pytanie miało prawie poprawną składnię:

cp P10802{75..83}.JPG ~/Images
Glenn Jackman
źródło
9

Aby iterować po zakresie w bash:

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

Stosując to samo w twoim przypadku:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
Shyam Sundar CS
źródło
To działa, ale bardziej podoba mi się odpowiedź @glenn jackman, ponieważ nie wywołuje żadnej konstrukcji programistycznej.
Amjith,
4

Zsh z opcją Extendedglob ma operator globowania (dopasowywania wzorca).

setopt extendedglob
echo P10802<75-83>.JPG

dopasuje nazwy plików w bieżącym katalogu, które pasują do tego wzorca (uważaj, że P1080275.JPG pasuje, ale P108020000000075.JPG również)

Z drugiej strony operator rozszerzenia ciągów {x ... y} (obsługiwany przez zsh i najnowsze wersje bash i ksh93) rozwija się do ciągów od x do y, niezależnie od tego, jakie pliki znajdują się w bieżącym katalogu.

cp P10802<75-83>.JPG ~there

skopiuje pasujące pliki, więc też

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

Ale wystąpią błędy, jeśli na przykład P1080281.JPG nie istnieje.

sch
źródło
1

Czy to zadziała dla ciebie:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
Janne Pikkarainen
źródło