Rinominare i file incrementando un numero all'interno del nome file


14

Ho una directory che contiene file di immagini numerati, qualcosa del genere:

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

A volte ci possono essere più versioni di un file in diversi formati (ad es. Un pnge svgversione del 03ei 09file sopra), ma i numeri sono altrimenti consecutivo. In genere ci sono 40-80 file di questo tipo in ogni directory. I numeri corrispondono all'ordine in cui queste immagini compaiono in un manoscritto (un documento di Word, ma non è importante). Non esiste altro modo per determinare l'ordine delle immagini.

Se aggiungo una nuova immagine al manoscritto, devo inserire una copia dell'immagine in questa directory con la numerazione corretta. Quindi, se la nuova immagine è la quinta nel manoscritto, devo rinominare i file nella directory in questo modo per fare spazio:

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

Qual è il modo più semplice dalla riga di comando o da uno script o una macro per rinumerare tutti i file a partire da un determinato numero? Ho un'installazione standard di Fedora Linux usando bash.

Risposte:


11

Penso che dovrebbe fare il lavoro:

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

Lo script accetta un parametro: il numero di una nuova immagine.

PS. Inserisci lo script in un'altra directory rispetto alle tue immagini. Nella directory delle immagini ci dovrebbero essere solo le immagini nominate in questo modo che hai descritto.


Sembra promettente, lo proverò tra qualche ora quando torno sul mio laptop.
robertc,


@mems L'OP afferma chiaramente che i nomi dei file iniziano con un numero
xhienne

2

Questo sarebbe più facile in zsh, dove puoi usare

  • il On qualificatore glob per ordinare le corrispondenze in ordine decrescente (e nper utilizzare l'ordine numerico, nel caso in cui i nomi dei file non abbiano tutti zeri iniziali della stessa larghezza);
  • il (l:WIDTH::FILLER:) flag di espansione del parametro per riempire tutti i numeri della stessa larghezza (la larghezza del numero più grande).
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

In bash, ecco uno script che presuppone che i file siano riempiti con una larghezza fissa (altrimenti, lo script non rinominerà i file giusti) e i pad con una larghezza fissa (che deve essere specificato).

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

Questo problema esatto è trattato in questo articolo . Nota che dovresti modificarlo per supportare i formati SVG e PNG, aggiungendo un secondo passo MV.


Non penso che sia il problema esatto, che rinumererà tutte le immagini ogni volta. Voglio solo rinumerare le immagini da un punto particolare.
robertc,

1

Più facile:

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

Otterrai:

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

Come aggiungerei lo zero iniziale per 1-9? Ricorda inoltre che potrebbero esserci due file 03.png e 03.svg.
robertc,

1

Non sembra esserci molto interesse recente per questa domanda ma, se qualcuno dovesse inciampare su di essa, ci sono tre problemi qui. Uno è come selezionare i file da rinominare in base a criteri semantici (l'intervallo non è lessicale e non può essere specificato da caratteri jolly o persino espressioni regolari - la teoria degli automi afferma che questo è più complesso di un NFA). Il secondo è come cambiare un nome modificandone una parte. Il terzo è come evitare la collisione dei nomi. Uno script in Bash e molte altre lingue possono fare questa trasformazione specifica, ma la maggior parte di noi preferisce non dover scrivere un programma ogni volta che vogliamo rinominare un mucchio di file. Con il mio rene.py (gratuito e open source) puoi fare quello che vuoi ma ci vogliono due invocazioni per evitare il problema di collisione del nome. Primorene ?.*/#7-80 %?.* Bincrementa tutti i nomi nell'intervallo, aggiungendo un prefisso% per evitare nomi esistenti. Quindi rene %* *rimuove questo prefisso da quei file che lo hanno. Lo descrivo su https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.