Basato su pattern, rinominare file batch nel terminale


48

Devo rinominare quanto segue:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

dentro, come moto a luogo, andare da dentro a fuori: I put my hand inTO my pocket = metto la mano in tasca

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

Come posso realizzarlo con una sola riga di comando terminale?


1
Un failsafe versione regex-based python che funziona in modo ricorsivo a tutte le sottocartelle: stackoverflow.com/a/39698169/191246
ccpizza

Risposte:


79

La soluzione dell'esempio precedente, usando rename :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Uso:

rename [options] [Perl regex search/replace expression] [files]

Da man rename:

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

rinominare può prendere regex come argomenti.

Quello che stiamo guardando è il contenuto tra le virgolette singole '. È possibile posizionare regex separati da /.

Formula: s/(1)/(2)/dove (1)= modello di ricerca e (2)= sostituisci modello.

Quindi, familiarizza con regex e goditi la ridenominazione di file batch basata su pattern!


14
So che si tratta di Ubuntu, ma se qualcuno finisce qui anche se stava cercando una soluzione OS X (l'ho fatto), renameè facilmente installabile brew install rename.
sandstrom,

In Ubuntu 18.10, invece --no-actè la bandiera --nono. Questa risposta potrebbe anche essere un po 'più esplicita: si [files]riferisce a un modello iniziale che corrisponde ai file nella directory corrente che si desidera rinominare potenzialmente (ad esempio, *corrisponde a tutto, ma solo nella directory corrente).
Patrick Dark,

Il tuo link punta a un altro rename, che ha un formato rename from to filee non supporta le espressioni regolari. In realtà, la mia distribuzione Linux (Cent OS 7) ha esattamente quella versione.
Alex Che

6

se i file si trovano in directory diverse, utilizzare la ridenominazione dopo una ricerca come:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

il -n dopo rinominare è testare, rimuoverlo per procedere! -)

in questo modo, associ trova e rinomina il potere.

Personalmente, l'ho usato per rinominare l'intestazione dei sorgenti .h in .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

C'è documentazione per il -iname, -typee -execle bandiere a manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression . ( find --helpnon è particolarmente utile per questo comando.) TL; DR: -inamecorrisponde a un modello senza distinzione tra maiuscole e minuscole; -type fcorrisponde a "file regolari"; ed -execesegue un'espressione fino a quando non incontra un carattere ;(punto e virgola).
Patrick Dark,

5

Questo può essere fatto con poca magia dell'espansione dei parametri bash!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;- In primo modello è usato per andare attraverso tutti i file che iniziano con 'file_anynumber_'
${f#file_[0-9]*_}- Il secondo modello file_[0-9]*_è utilizzato in espansione di parametro che racconta bash per rimuovere 'file_anynumber_' dal chiedere l'elemosina della stringa.

Per maggiori informazioni su Parameter expansion:

man bash

Nota che questo usa globs, non regex, quindi [0-9]*corrisponderà a una cifra seguita da qualsiasi stringa. Probabilmente c'è un modo migliore per abbinare solo i numeri, ma non riesco a pensare a nulla di sintetico.
wjandrea,

Potresti anche suggerire un modo per far funzionare ricorsivamente questo comando in tutte le sottodirectory?
Francesco DM,
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.