Rinominare i file nella cartella locale aggiungendo un prefisso o suffisso


12

Ho molti file in una cartella e voglio aggiungere un prefisso o un suffisso (non entrambi ) ad essi. Ho controllato qui e ho scoperto che posso usare

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

per aggiungere un prefisso a tutti i file che terminano con .jpg(e se rimuovo .jpg, aggiungerà il prefisso a tutti i file nella cartella corrente).

Tuttavia, mi piacerebbe poterlo fare

  • Aggiungi un suffisso (ovvero, rinomina filename.extin filename.whatever.ext),
  • Verifica se il prefisso o il suffisso è già presente e quindi salta,
  • Crea un alias che accetta argomenti come addprefix whatever *.extoaddsufix whatever *.*

Risposte:


10

Se stai usando bash, allora questo one-liner può farlo per voi (ammesso che abbiate le variabili $prefix, $suffixe $extensionprontamente disponibili)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Potresti avere i tuoi script in questo modo

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

e

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done

È quasi perfetto! Sarebbe perfetto se (1) controllasse se il prefisso o il suffisso è già presente (e quindi ignorato), e (2) ha funzionato su file senza estensione. Scusa se mi disturbo così tanto ...
— Quel ragazzo brasiliano,

Per (1) potresti (penso, non testato) aggiungere il controllo del prefisso avvolgendo mv in an if [ $f == $prefix* ]e puoi modificare quello con if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]i comandi mv intorno a adduffix. Per (2) dovrebbe già funzionare su file senza estensione, a meno che non sia un programmatore orribile.
— Aaron Okano,

7

C'è un comando Perlrename che dovrebbe fare il trucco. Attenzione però: ci sono diversi comandi chiamati rename, quindi assicurati di avere lo script Perl che si aspetta un perlexprcome argomento. Questo è il renamecomando fornito dal perlpacchetto su Debian e derivati ​​(Ubuntu, Mint, ...), ma non su altre distribuzioni che potrebbero avere una diversa utility chiamata rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Come puoi vedere, è idempotente : non aggiungerà di nuovo il prefisso quando lo chiami più volte.

Funziona sostituendo l'inizio (lunghezza zero) delle stringhe ( ^) o l'inizio seguito da una prefixstringa opzionale con prefix.

Lascerò incapsulare questo in uno script di shell o in una funzione di shell come esercizio per te :)

Postfix è un po 'più difficile, perché devi capire quale parte del nome del file costituisce l'estensione ...


Questa è una bella risposta, ma stavo cercando qualcosa di più universale; per questa risposta è necessario che sia presente sia questo specifico (o equivalente) rename. E so che i suffissi sono un po 'più difficili, non era coperto dalla domanda collegata, e sono un principiante su Linux, Bash, shell script, perl ed espressioni regolari, quindi "un po' più difficile" è abbastanza difficile per me ! :)
— Quel ragazzo brasiliano,

4

Con zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~è l'operatore globbing che significa tranne in zsh.


1

Semplice esempio per modificare il prefisso e l'estensione di tutte le immagini nella cartella corrente.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Se vuoi verificare come influenzerebbe i tuoi dati prima di modificarli, sostituisci mv con echo

l'uscita per IMG_7993.JPG è EG_IMG_7993.jpg

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.