Dosya adındaki bir sayıyı artırarak dosyaları yeniden adlandırma


14

Numaralı görüntü dosyaları, böyle bir şey içeren bir dizin var:

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

Bazen bir dosyanın farklı formatlarda birden fazla versiyonu olabilir (örn. A pngve yukarıdaki ve dosyalarının svgversiyonu ), ancak sayılar başka şekilde ardışık olabilir. Genellikle her dizinde 40-80 dosya bulunur. Sayılar, bu görüntülerin bir makalede göründüğü sıraya karşılık gelir (bir Word belgesi, ancak bu önemli değildir). Görüntülerin sırasını belirlemenin başka bir yolu yoktur.0309

Makaleye yeni bir resim eklersem, resmin bir kopyasını doğru numaralandırma ile bu dizine yerleştirmem gerekir. Bu yüzden yeni görüntü el yazmasında beşinci ise, ona yer açmak için dizindeki dosyaları yeniden adlandırmam gerekir:

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

Belirli bir sayıdan başlayarak tüm dosyaları yeniden numaralandırmanın komut satırından veya bir komut dosyasından veya makrodan en kolay yolu nedir? Bash kullanarak standart bir Fedora Linux kurulumum var.

Yanıtlar:


11

İşi yapması gerektiğini düşünüyorum:

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

Komut dosyası bir parametre alır - yeni görüntünüzün sayısı.

PS. Komut dosyasını resimlerinizden başka bir dizine koyun. Resim dizininde yalnızca bu şekilde tanımladığınız resimler olmalıdır.


Bu umut verici görünüyor, dizüstü bilgisayarıma döndüğümde birkaç saat içinde deneyeceğim.
robertc

Bu yalnızca dosya
adınız

OP OP, dosya adlarının bir sayı ile başladığını açıkça belirtiyor
xhienne

2

Kullanabileceğiniz zsh'de bu daha kolay olurdu

  • On Glob niteleyici azalan sıralama ile eşleşir (ve bu nnumara sırasına kullanımı, durumda dosya isimleri aynı genişliğe sıfır gelen yok);
  • tüm numaraları aynı genişliğe (daha büyük sayının genişliği) yerleştirmek için (l:WIDTH::FILLER:) parametre genişletme bayrağı .
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

Bash'da, dosyaların sabit bir genişliğe (aksi takdirde komut dosyası doğru dosyaları yeniden adlandırmayacaktır) ve pedleri sabit bir genişliğe (belirtilmesi gerekir) doldurduğunu varsayan bir komut dosyası.

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

Bu sorun bu makalede ele alınmıştır . İkinci bir MV adımı ekleyerek SVG ve PNG formatlarını destekleyecek şekilde değiştirmeniz gerektiğini unutmayın.


Bunun tam sorun olduğunu sanmıyorum, bu her seferinde tüm görüntüleri yeniden numaralandıracak. Sadece belirli bir noktadan görüntüleri yeniden numaralandırmak istiyorum.
robertc

1

Daha kolay:

touch file`ls file* | wc -l`.ext

Alacaksınız:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

1-9 için önde gelen sıfırı nasıl eklerim? Ayrıca 03.png ve 03.svg adlı iki dosya olabileceğini unutmayın.
robertc

1

Bu soruya yakın zamanda ilgi duyulmuyor gibi görünüyor, ancak birisi onunla karşılaşırsa, burada üç sorun var. Bunlardan biri, anlamsal ölçütlere göre yeniden adlandırılacak dosyaları nasıl seçeceğinizdir (aralık sözcüksel değildir ve joker karakterler veya düzenli ifadeler ile belirtilemez - otomata teorisi bunun bir NFA'dan daha karmaşık olduğunu söyler). İkincisi, bir kısmını değiştirerek adın nasıl değiştirileceği. Üçüncüsü, isim çarpışmasının nasıl önleneceği. Bash ve diğer birçok dilde bir komut dosyası bu özel dönüşümü yapabilir, ancak çoğumuz bir grup dosyayı yeniden adlandırmak istediğimizde bir program yazmak zorunda kalmayacağız. Benim (ücretsiz ve açık kaynak) rene.py ile istediğini yapabilirsin ama isim çarpışma probleminden kaçınmak için iki çağrı gerekiyor. İlkrene ?.*/#7-80 %?.* Baralıktaki tüm adları artırır ve mevcut adlardan kaçınmak için% öneki ekler. Ardından rene %* *bu öneki, sahip olduğu dosyalardan kaldırır. Bunu https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/ adresinde açıklarım.

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.