Ganti nama file dengan menambahkan nomor di dalam nama file

14

Saya memiliki direktori yang berisi file gambar bernomor, sesuatu seperti ini:

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

Kadang-kadang mungkin ada beberapa versi dari file dalam format yang berbeda (misalnya. A pngdan svgversi 03dan 09file di atas) tetapi jumlahnya sebaliknya berturut-turut. Biasanya ada 40-80 file seperti itu di setiap direktori. Angka-angka sesuai dengan urutan gambar-gambar ini muncul dalam naskah (dokumen Word, tapi itu tidak penting). Tidak ada cara lain untuk menentukan urutan gambar.

Jika saya menambahkan gambar baru ke naskah saya perlu menempatkan salinan gambar di direktori ini dengan penomoran yang benar. Jadi jika gambar baru adalah yang kelima dalam naskah saya perlu mengganti nama file dalam direktori ini untuk membuat ruang untuk itu:

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

Apa cara yang paling mudah dari baris perintah, atau dari skrip atau makro untuk memberi nomor baru semua file mulai dari nomor tertentu? Saya memiliki instalasi Fedora Linux standar menggunakan bash.

robertc
sumber

Jawaban:

11

Saya pikir itu harus melakukan pekerjaan:

#!/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

Script mengambil satu parameter - jumlah gambar baru Anda.

PS. Letakkan skrip di direktori lain selain gambar Anda. Dalam direktori gambar harus ada hanya gambar bernama dengan cara ini yang Anda jelaskan.

pbm
sumber
Ini terlihat menjanjikan, saya akan mencobanya dalam beberapa jam ketika saya kembali ke laptop saya.
robertc
Ini hanya akan berfungsi jika nama file Anda tidak diawali oleh karakter non-numerik
mems
@mems OP dengan jelas menyatakan bahwa nama file dimulai dengan angka
xhienne
2

Ini akan lebih mudah di zsh, tempat Anda dapat menggunakannya

  • yang On kualifikasi glob untuk pertandingan semacam dalam urutan menurun (dan nmenggunakan nomor urut, dalam kasus nama file tidak semua memiliki nol dengan lebar yang sama terkemuka);
  • yang (l:WIDTH::FILLER:) bendera ekspansi parameter untuk pad semua nomor dengan lebar yang sama (lebar jumlah yang lebih besar).
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

Di bash, berikut ini skrip yang mengasumsikan file berlapis ke lebar tetap (jika tidak, skrip tidak akan mengganti nama file yang tepat) dan bantalan ke lebar tetap (yang harus ditentukan).

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Masalah persis ini tercakup dalam artikel ini . Perhatikan bahwa Anda harus memodifikasinya untuk mendukung format SVG dan PNG, dengan menambahkan langkah MV kedua.

Jodie C
sumber
Saya tidak berpikir itu adalah masalah yang tepat, itu akan memberi nomor baru semua gambar setiap waktu. Saya hanya ingin memberi nomor baru pada gambar dari titik tertentu.
robertc
1

Lebih mudah:

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

Anda akan mendapatkan:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext
Hugoren Martinako
sumber
Bagaimana saya menambahkan nol di depan untuk 1-9? Juga ingat mungkin ada dua file 03.png dan 03.svg.
robertc
1

Tampaknya tidak ada banyak minat baru-baru ini dalam pertanyaan ini tetapi, jika seseorang menemukan itu, ada tiga masalah di sini. Salah satunya adalah bagaimana memilih file untuk diganti nama berdasarkan kriteria semantik (kisaran tidak leksikal dan tidak dapat ditentukan oleh wildcard atau bahkan ekspresi reguler - teori automata mengatakan bahwa ini lebih kompleks daripada NFA). Yang kedua adalah bagaimana mengubah nama dengan memodifikasi sebagian dari itu. Yang ketiga adalah bagaimana menghindari tabrakan nama. Sebuah skrip dalam Bash dan banyak bahasa lain dapat melakukan transformasi khusus ini, tetapi kebanyakan dari kita lebih suka tidak harus menulis sebuah program setiap kali kita ingin mengganti nama banyak file. Dengan rene.py (gratis dan open source) saya, Anda dapat melakukan apa yang Anda inginkan tetapi dibutuhkan dua doa untuk menghindari masalah nama tabrakan. Pertamarene ?.*/#7-80 %?.* Bmenambah semua nama dalam rentang, menambahkan awalan% untuk menghindari nama yang ada. Kemudian rene %* *hapus awalan ini dari file-file yang memilikinya. Saya jelaskan ini di https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

David McCracken
sumber