Rinomina in batch i file in minuscolo


17

C'è un modo per rinominare tutti i file in una directory in minuscolo | maiuscolo?

Sto cercando un comando oneliner .

Ho adorato TotalCommander alt+f7, ora ho bisogno di quella funzionalità nel Terminale

Risposte:


20

Per ogni file a_filenella directory corrente rinominare a_filein minuscolo.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

Per le maiuscole, invertire gli argomenti in [:lower:] [:upper:]

trlink di riferimento del comando

Aggiornare

Per un controllo ancora maggiore *può essere sostituito con ls.

Ad esempio in una directory contenente 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg e 3.jpg per filtrare solo i file * .jpg, è lspossibile utilizzare:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

Il codice sopra assegnato assegnerà alla a_filevariabile tutti i file con estensione .jpg.

Aggiornare aggiunto -vopzione di mvcomando come da sds suggerito.


4
potresti voler passare "-v" in mvmodo da vedere cosa viene fatto; potresti non voler passare "-f" perché questo potrebbe ostruire i file esistenti
sds

Questo non funziona per i file con spazi nel loro nome.
Tianxiang Xiong,

Puoi usare le virgolette attorno al nome del file.
Stef K,

2
Ci dispiace, ma la parte su ls * jpg è una cattiva idea. mywiki.wooledge.org/ParsingLs Puoi ottenere lo stesso risultato con * jpg lungo dove avevi * in primo luogo.
tink

16

C'è un'utilità più elegante e generale chiamata prename.

Scritto da Larry Wall, viene fornito in perlmodo che sia molto probabilmente già disponibile sul tuo sistema poiché /usr/bin/prename(se hai alternative di installazione potrebbe essere disponibile anche come /usr/bin/renamelink simbolico tramite / etc / alternatives a prename)

Usandolo puoi rinominare più file in un comando fornendo qualsiasi espressione perl (incluso ma non limitato a sostituzione s///o traslitterazione caratteri tr///):

Esempi:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

E così via.

Un'altra cosa bella del nome è che ti protegge, nel caso di rinominare un file con un nome di file esistente.

man prename per ulteriori dettagli.


1

utilizzando find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Per find

  • Naturalmente dopo aver -namemesso il tuo modello.
  • -maxdepth 0: Solo la directory corrente.

Per rename

  • -n, -nono: Nessuna azione: stampa i nomi dei file da rinominare, ma non rinominarli.
  • y/source/dest/: Traslittera i caratteri nello spazio del motivo che appaiono in origine al carattere corrispondente in dest.
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.