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.