Come posso rinominare facilmente più file usando la riga di comando?


103

Uno dei modi in cui rinominare rapidamente i file in Windows è

F2 > Rename > Tab (to next file) > Rename ...

Ma in Ubuntu / Nautilus, non posso passare al file successivo. Ma essendo su Linux, penso che ci debba essere un'alternativa alla riga di comando.

Tuttavia, a volte, potrei desiderare un maggiore controllo su come rinominare file specifici. In tal caso, forse è meglio essere in grado di passare al file successivo


1
Potresti definire "maggiore controllo"? Non sono sicuro di quello che stai chiedendo esattamente ...
Dang Khoa,

Penso che questa domanda non abbia una risposta. Quello che stai chiedendo (F2 e poi passa in modalità F2 al file successivo) non è attualmente disponibile, penso in Nautilus.
don.joey,

Risposte:


189

Lo uso renamesempre. È piuttosto semplice, ma spero che tu conosca la regex di base:

rename "s/SEARCH/REPLACE/g"  *

Questo sostituirà la stringa SEARCHcon REPLACEin ogni file (cioè, *). Il /gmezzo è globale, quindi se avessi un SEARCH_SEARCH.jpg, verrebbe rinominato REPLACE_REPLACE.jpg. Se non lo avessi fatto /g, avrebbe fatto la sostituzione solo una volta, e quindi ora chiamato REPLACE_SEARCH.jpg. Se si desidera la distinzione tra maiuscole e minuscole, aggiungere /i(che sarebbe, /gio /igalla fine).

Con le espressioni regolari, puoi fare molto di più.

Si noti che questo renameè il comando prename(noto anche come Perl rename), che supporta espressioni regolari complete Perl. Ce n'è un altro renameche usa schemi e non è così potente. prenameera installato di default su Ubuntu (insieme a Perl), ma ora potresti dover fare:

sudo apt install rename

Ecco alcuni esempi:

Prefisso

Aggiungi :

rename 's/^/MyPrefix_/' * 
  • document.pdf rinominato in MyPrefix_document.pdf

Rimuovi :

Inoltre è possibile rimuovere stringhe indesiderate. Supponiamo che tu abbia 20 file MP3 chiamati like CD RIP 01 Song.mp3e che desideri rimuovere la parte "CD RIP" e che desideri rimuoverli da tutti con un solo comando.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 per 01 Song.mp3

Notare lo spazio aggiuntivo in '^CD RIP ', senza lo spazio tutti i file avrebbero uno spazio come primo carattere del file. Inoltre, funzionerà senza il ^carattere, ma corrisponderebbe CD RIP a qualsiasi parte del nome file. La ^garanzia rimuove i caratteri solo se sono l'inizio del file.

Suffisso

Aggiungi :

rename 's/$/_MySuffix/' *
  • document.pdf rinominato in document.pdf_MySuffix

Cambiamento :

rename 's/\.pdf$/.doc/' *

cambierà Something.pdfin Something.doc. (Il motivo della barra rovesciata è che .è un carattere jolly in regexp, quindi .pdfcorrisponde qPDFmentre corrisponde \.pdfsolo alla stringa esatta .pdf. Inoltre, è molto importante notare che se non si ha familiarità con BASH, è necessario inserire barre rovesciate tra virgolette SINGOLE! Non è possibile omettere le virgolette oppure usa le virgolette doppie, o bash proverà a tradurle. In bash \. ed è "\." uguale .(ma vengono usate virgolette doppie e barre rovesciate, ad esempio "\ n" per una nuova riga, ma poiché "\."non è una sequenza di back escape valida, si traduce in .)

In realtà, puoi anche racchiudere le parti della stringa tra virgolette anziché nel loro insieme: 's/Search/Replace/g'è uguale a s/'Search'/'Replace'/ge s/Search/Replace/gBASH. Devi solo stare attento ai caratteri speciali (e agli spazi).


Ti suggerisco di usare l' -nopzione quando non sei sicuro di avere le espressioni regolari corrette. Mostra ciò che sarebbe stato rinominato, quindi esce senza farlo. Per esempio:

rename -n s/'One'/'Two'/g *

Questo elencherà tutte le modifiche che avrebbe apportato, se non avessi messo la -nbandiera lì. Se ha un bell'aspetto, premere Upper tornare indietro, quindi cancellare -ne premere Enter(o sostituirlo con -vper visualizzare tutte le modifiche apportate).

Nota : le versioni di Ubuntu precedenti alla 17.04 non vengono fornite renameper impostazione predefinita, tuttavia è ancora disponibile nei repository. Utilizzare sudo apt install renameper installarlo


Come avrò un suffisso "dinamico". Come 001 - 010 ecc. Possibile?
Jiew Meng,

Hmm .. Ho provato a scrivere qualcosa ma non ha funzionato. Soprattutto perché, quando aggiungo 1 a 001, si aggiunge a 2, non a 002. Altrimenti, potrei semplicemente usare le variabili per mantenere la posizione numerica, quindi aggiungerla. Inoltre, ho appena ricordato, prima di conoscere il renamecomandante, questo è quello che ho fatto per aggiungere:for f in *; do mv -v "$f" "prependThis$f"; done
Matt

2
@jiewmeng Sì. Utilizzare (?:\.[0-9]{3})$nel modello, corrisponderà a tutte le estensioni di file a 3 cifre in un gruppo passivo. Esempio: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Dai un'occhiata a questo cheat sheet regex .
sergio91pt,

@ sergio91pt è un bel cheat sheet regex. Ma di cosa si tratta? Deve essere perl - ma non riesco a trovare una nota del genere lì.
Adobe,

@Adobe È generale per "regex basato su perl". Guarda la nota sul segno + e la colonna relativa alle classi di caratteri POSIX.
sergio91pt,

21

Prova pyrenamer .

Non è integrato con nautilus, ma fa il lavoro. Ecco una recensione

Thunar (parte di XFCE) ha anche un renamer che puoi eseguire separatamente.

Rinomatore di massa Thunar


2
grazie per aver menzionato la funzionalità Thunar. Se hai Thunar: seleziona i file nella cartella e premi F2.
Max

9

Sembra che ci sia un progetto sul launchpad chiamato nautilus-renamer . Puoi installarlo eseguendo make installuna volta scaricato lo script e decomprimendolo. Sembra avere alcune funzionalità o se sai che un po 'di programmazione potrebbe essere potresti semplicemente migliorarlo in base alle tue necessità in quanto è solo uno script Python.

inserisci qui la descrizione dell'immagine


8

Nella riga di comando, per rinominare un singolo file il comando è semplicemente

mv file1.txt file2.txt

Se vuoi farlo in batch, probabilmente vorrai farlo tramite uno script. Se fornisci ulteriori dettagli, io o qualcun altro probabilmente possiamo crearne uno per te. Detto questo, uno script per aggiungere elementi a un file potrebbe essere simile al seguente:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

A seconda di come esattamente hai bisogno di cose rinominate, questo sarà probabilmente modificato, ad esempio se hai regole di ridenominazione specifiche da seguire. (Personalmente lo farei tramite uno script Perl dato che il mio bash-foo non è eccezionale, ma sono solo io.)

Nota che ho ottenuto la separazione di nome file ed estensione da una domanda precedentemente posta .


7

Nel caso in cui tu voglia farlo senza riga di comando, in modo simile a quello che hai fatto in Windows, usa il tasto freccia destra invece del tasto tab . Questo selezionerà il file successivo proprio come fa la scheda in Windows.


Non è lo stesso: avresti comunque bisogno di INVIO per terminare la ridenominazione, il tasto freccia per passare al file successivo e F2 per rinominarlo. TAB lo fa in 1 passaggio dopo aver rinominato un file.
MestreLion,

@MestreLion Ma è molto simile all'algoritmo descritto nella domanda e non richiede alcun software aggiuntivo né operazioni da riga di comando. Un po 'di essere user-friendly.
Rafał Cieślak,

È vero, eri l'unica risposta che almeno ha provato lo stesso approccio della domanda originale. E la triste verità è che Nautilus non ha tale funzionalità. Puoi rinominare F2, ma questo è tutto. Nessuna TAB per passare automaticamente al file successivo in modalità rinomina già.
MestreLion

7

Non è proprio la stessa domanda di Come è possibile rinominare più file contemporaneamente? ma suggerirò lo stesso programma che ho suggerito in quella risposta: qmv .

qmv è uno strumento utile dal pacchetto renameutils. Ti consente di utilizzare il tuo editor di testo preferito per rinominare i file. In combinazione con il potere di VIM, hai un'eccellente utility di rinomina.

Di solito lo invoco come qmv -f donella directory in cui voglio rinominare un mucchio di file. O se voglio rinominare in modo ricorsivo qmv -R -f do.

Ogni volta che ho la necessità di rinominare più file, torno sempre su qmv (e vim).

http://www.nongnu.org/renameutils/


Ho appena provato questo sulla base del tuo suggerimento. Questo è davvero lo strumento più fantastico se usi vim!
ste_kwr,

3

Se l'unica opzione adatta è rinominare i file manualmente, un ottimo modo per farlo è usare vidir(nel moreutilspacchetto):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Esempi


Rinominare i file in modo selettivo

Contenuto della directory di lavoro corrente:

.
├── bar
├── baz
└── foo

Esegui vidir, rinomina i nomi dei file nelle righe che contengono i nomi dei file che desideri rinominare; premi CTRL+ Oe CTRL+ X:

screenshot3

.
├── bar.bak
├── baz.old
└── foo.new

Cambio selettivo dei nomi dei file

Contenuto della directory di lavoro corrente:

.
├── bar
├── baz
└── foo

Contenuto dei file della directory di lavoro corrente:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Esegui vidir, cambia i numeri nelle righe contenenti i nomi dei file che desideri cambiare; premi CTRL+ Oe CTRL+ X:

screenshot4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Rimozione selettiva dei file

Contenuto della directory di lavoro corrente:

.
├── bar
├── baz
└── foo

Esegui vidir, rimuovi le righe contenenti i file che desideri eliminare; premi CTRL+ Oe CTRL+ X:

screenshot2

.
└── baz

2

Sto usando krename. È un'app GUI. Potrebbe leggere tag mp3 e così via.

Esiste sia come app separata che come parte di Krusader.

C'è anche uno renamescript - che fa parte dell'installazione standard di perl (probabilmente lo hai installato). Dai un'occhiata con man rename.

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.