Bir dizindeki tüm dosya adlarından 1 çıkarın (yeniden adlandırın).


17

Benim gibi isimleri olan görüntü dosyaları içeren bir dizin var

image1.jpg 
image2.jpg 
image3.jpg
...

Ne yazık ki, resim adları sıfır temelli image1.jpgolmalı , öyle olmalı image0.jpg, image2.jpgolmalı image1.jpgve böyle devam etmelidir .

Bunun gibi mv komutları oluşturmak için bir komut dosyası yazabilir , bir kabuk komut dosyasına koyabilir ve sonra bunları yürütebilirim -

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

Ama sanırım Unix'te bunu yapmanın daha temiz bir yolu var. Öyleyse nedir?


6
Aslında, boşluk olmadığı sürece bunu yapmanın en basit yolu. ( for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done)
Ricky Beam

5
Görüntülerin sırası önemli mi? Aksi takdirde, sadece son görüntüyü yeniden adlandırmak imageN.jpgiçin image0.jpgve bitirdiniz.
jnovacho

@jnovacho, oldukça zeki! Ancak evet, görüntülerin sırası önemlidir.
Wes

Yanıtlar:


20

Eski güzel perl adını değiştir:

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *

[Uyarılar]

Görüntü numaraları 0'dan büyük olmalıdır.

Görüntülerin 9'dan büyük olması ve $(ls -v1 *)0'lara öncülük etmemesi durumunda , tıkanmayı önlemek için kullanın. @Arielf tarafından teklif edildi ve @Graeme tarafından fark edildi.

Şüphe -vduyduğunuzda, ayrıntılı ve -neylemsiz olarak da kullanın.


"E" neyi gösterir?
Wes

3
'e' değerlendirme anlamına gelir, değiştirme bölümü değerlendirilir. ayrıca bkz.perlreref

6
Herhangi bir hızlandırıcıyı önlemek için dosyalar artan sırada geçirilmelidir. Bu, yalnızca 10'dan az dosya varsa (veya sayıların başında sıfırlar varsa) iyi çalışır.
Graeme

Bunu zaten fark ettim, ayrıca 0kaynaklarda a olmamalıdır .

2
*sonunda ile değiştirin ve `ls -v1 *`clobbering daha güvenli olacak. En düşük sayıdan en yüksek sayıya geçer.
arielf

6

Oluşturulan mvkomutları birbirine ekleyebilirsiniz bash. Bu yüzden bunları bir komut dosyasına kopyalamanız ve yürütmeniz gerekmez. Görmek:

command_that_generates_mv_commands | bash

Ve her şey borsada idam edilecek bash.


Bu daha temiz değil. :)Sorunu çözer, yani +1.
JMCF125

5

LS çıktısında yineleyebilirsiniz, bu örnek için çalışır:

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done

Dosyalarınızın aynı yolunda olmalısınız


1
Kullanımı daha iyi -iveya -nbununla birlikte mv, kenar durumlarda üzerine yazmayı önleyecektir.
Graeme

sort -Vdaha iyi olmaz mıydı ?
user80551

sortişe yaramazsa, daha image10.jpgönce image1.jpgbir sorun olabileceğini gösterecektir . sort -nk 1.8@ Graeme'nin cevabında olduğu gibi ihtiyacınız var.
terdon

@ user80551, sort -Viyi bir fikir, cevabıma ekleyeceğim. Yine de başka uç durumlar olabilir, birisinin kopyalayıp bitmesi durumunda bu tür seçenekleri eklemek için genellikle iyi bir tavsiye.
Graeme

4

Aşağıdakiler desene uyan herhangi bir şey için işe yarıyor gibi görünüyor imageNUMBER.jpg. Önce komutun ne yapacağını göstermek echoiçin mvkomutun önüne yerleştirdim ; aslında yeniden adlandırma işlemini gerçekleştirmek içinecho

for i in `ls image*.jpg|sort -V` ; do 
    x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
    y=$(( $x - 1 ))
    echo mv -i $i image$y.jpg
done

İlk satırda, ls image*.jpg|sort -VJPG dosyalarının dosya adında artan sayılarla listelenmesine neden olur. x=Hat dosya ismi numarasını çıkarır. y=Hattı daha sonra birer numara azaltır. Girdi dosya adı ve ysayı daha sonra mvkomutta kullanılır ; burada -ibayrağın üzerine bir dosya yazmadan önce bildirim gönderilir.

Kendi küçük testim için bu çıktıyı üretti:

mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg

Şahsen, daha farklı bir dosya adına yeniden adlandırmayı öneririm, çünkü dosyaların işlenme sırası büyük bir fark yaratabilir.


1
Kullanımı daha iyi -iveya -nbununla birlikte mv, kenar durumlarda üzerine yazmayı önleyecektir.
Graeme

Çok iyi bir öneri, cevabı düzenleyeceğim
brm

MacOS'ta, kullanmalısınız sort -n, -Vseçenek mevcut değildir.
Vincent Sit

4

Debian tabanlı dağıtımlarda yeniden adlandırmak için işaretlenmiş perlkomut dosyasını kullanmak için prenameGNU find/ gereklidir sort. Herhangi bir üzerine yazmayı önlemek için dosyalar artan düzende yerleştirilir.

find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
  xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'

-nİstediğinizi yaptığınızdan emin olduktan sonra kaldırın . Daha önce var olan dosyalar hakkında uyarır. Ancak, dosyaların artan sırada yeniden adlandırıldığını gösterdiği sürece, gerçek için çalıştırıldığında çakışma olmayacaktır.


Dosyada bununla ilgili sorunlar zaten var.
Wes

4

İle zsh:

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

( -nmutlu olduğunda çıkarın ).

(n)listeyi sayısal olarak sıralamaktır, böylece image9.jpgdaha önce yeniden adlandırılmıştır image10.jpg.

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.