Qual è la differenza tra 'rename' e 'mv'?


12

Per me non è del tutto chiaro, ma qual è la differenza tra mve rename(da util-linux-ng 2.17.2as /usr/bin/rename)? Ci sono vantaggi l'uno rispetto all'altro oltre renameall'accettazione delle espressioni regolari e mvno? Credo che renamepossa anche gestire più nomi di file contemporaneamente, mentre mvnon lo fa.

Non sono riuscito a trovare una chiara indicazione nelle loro manpagine cos'altro li distingue o attraverso alcune indagini da solo.


2
Assicuriamoci di parlare delle stesse cose; quali sono gli output da type -a renamee rename --version?
Jeff Schaller

@JeffSchaller È più una curiosità da parte mia, ma su una delle mie macchine * nix ottengo rename is /usr/bin/renamee rename (util-linux-ng 2.17.2)rispettivamente.
Urda,

6
Ci sono alcuni nomi diversi là fuori , e avrebbe potuto essere un alias / funzione / script, quindi volevo solo assicurarmi di sapere cosa fosse. Grazie! Sentiti libero di modificare questi output nella tua domanda.
Jeff Schaller

@JeffSchaller non preoccuparti, in realtà questo link è stato uno che ho appena scoperto che mi ha mostrato che renamepuò significare cose diverse in diverse distro.
Urda,

5
Sembra che la tua domanda contenga la sua risposta. "Qual è la differenza tra un jet e un triciclo, a parte il fatto che un jet può volare e può andare diverse migliaia di volte più veloce?" :-) ⁠
G-Man dice "Ripristina Monica" il

Risposte:


21

Fondamentalmente è quello che dice sul coperchio, per entrambi.

mvè un'utilità standard per spostare uno o più file su una determinata destinazione. Può essere usato per rinominare un file, se c'è solo un file da spostare. Se ce ne sono diversi, mvfunziona solo se la destinazione è directory e sposta i file lì.

Quindi mv foo barsposta il file foonella directory bar(se esiste) o rinominalo fooin bar(se barnon esiste o non è una directory). mv foo1 foo2 barsposterà entrambi i file nella directory baro si lamenterà se barnon è una directory.

mvchiamerà la rename()funzione libreria C per spostare i file e, se non funziona (vengono spostati in un altro file system), copierà i file e rimuoverà gli originali.

Se tutto ciò che hai è mve vuoi rinominare più file, dovrai usare un loop shell. Ci sono una serie di domande su che qui sul sito, si veda ad esempio questo , questo , e altri .


D'altra parte, le varie renameutility rinominano i file, individualmente.

Il renamefrom util-linux di cui parli fa una semplice sostituzione di stringa, ad es. rename foo bar *Cambierebbe foobarin barbar, e asdffooin asdfbar. Essa non è , tuttavia, prendere un espressione regolare!

L'utilità di ridenominazione Perl ( o varie sue istanze ) accetta un'espressione Perl per trasformare i nomi dei file. Molto probabilmente si utilizzerà un comando, in cui il modello è un'espressione regolare.s/pattern/replacement/

Sia la ridenominazione util-linux che la ridenominazione Perl possono essere usate per spostare i file in un'altra directory contemporaneamente, apportando opportune modifiche al nome del file, ma è un po 'imbarazzante. Né fa altro che chiamare rename()i file, quindi il passaggio da un filesystem a un altro non funziona.

Per quanto riguarda quello che renamehai, può dipendere dalla tua distribuzione e / o da ciò che hai installato. Molti di loro supportano rename --version, quindi usalo per identificare quale hai.


Non solo "espressione regolare" ma funzione se necessario
Gilles Quenot

@GillesQuenot, beh, sì, potresti fare ad esempio rename '$_=lc' *nomi di file in minuscolo. Ma penso che il caso più comune sia quello di usare s///(che ho menzionato) e la sua parte di schema è una regex; Non penso che tu possa usare una funzione lì. Tuttavia, potresti farlo nella parte di ricambio.
ilkkachu,

@MyWrathAcademia, Quel primo esempio nella pagina man funziona per me (fa le cose in modo diverso dall'altro). Inoltre, il motivo per cui ho collegato alle manpage di Debian è che almeno lì è stato chiarito che la pagina man per rename.ulè e sarà per la versione util-linux, e non per nessuna delle altre.
ilkkachu,

@ilkkachu, ti dispiace aggiungere una spiegazione al primo esempio nella tua risposta o in un commento. È diverso dall'esempio, man renamequindi sarebbe bene conoscere la tua comprensione dell'esempio debian
MyWrathAcademia

@MyWrathAcademia, immaginai che tu intendessi l' rename foo foo0 foo?; rename foo foo0 foo??esempio, dato che quella era l'unica differenza tra quelle due pagine man che ho visto. Quella coppia di comandi funziona perché la prima aggiunge uno zero ai nomi di ciascun nome di file a una cifra e, successivamente, la seconda aggiunge (un altro) zero a ogni nome di file a due cifre. Quel secondo set include i file rinominati dal primo comando. Usando rename foo foo00 foo?come funziona anche il primo comando, aggiunge solo due zeri alla volta.
ilkkachu,

2

mvcambia semplicemente il nome del file (può anche spostarlo in un altro filesystem o percorso). Gli dai un vecchio nome e un nuovo nome e cambia il file con il nuovo nome o posizione. renameviene utilizzato per apportare modifiche di denominazione in blocco. Diciamo che ha avuto un file di mille, foo000.logattraverso foo999.loge si voleva cambiare loro bar000.logtramite bar999.log. Con mvdovreste fare mv foo000.log bar000.log, mv foo001 bar001.loge così via oppure scrivere uno script. Con renamete semplicemente rename foo bar foo*.log, e voilà, mille file vengono cambiati in un istante! Abbastanza bello Controlla di man renamenuovo la pagina per i dettagli.


2

mv

È una riga di comando di base progettata per fare una cosa e farlo bene (filosofia Unix): spostare file (s) o directory (s) .

Puoi hackerare STDOUT& STDIN¹ per modificare al volo la stringa di destinazione, ma non è solo un trucco intelligente

rinomina (quella di Perl)

avvertimento Esistono altri strumenti con lo stesso nome che possono o meno essere in grado di farlo, quindi fai attenzione.

Quando le persone parlano rename, pensiamo a questo, non a ELFquello, meno potente (magia?).

Non è semplice, è Perl. Puoi passare alcune funzioni di Perl all'interno ed è estremamente potente.

Considera questo esempio:

Vuoi rinominare un mucchio di file come

foobar_1.txt
foobar_2.txt
foobar_3.txt

Puoi anteporre zeri alle cifre in sprintf()questo modo (usando regex, heh, è ​​Perl: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

Ora hai:

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Non è davvero un comando di base, vero?

non è progettato per spostare dir (s) , ma può farlo:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

Il file spostato

/tmp/file

¹ del codice che vediamo sui *.stackexchange.*siti Web

inserisci qui la descrizione dell'immagine

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

Non è la strada da percorrere , è semplicemente buggy, solo per spiegare perché usare lo strumento giusto al momento giusto


+1 per sprintfing con rinomina
Archemar

-1

mv sposta o rinomina file e directory e li eseguirà il backup; rinominare solo rinominare i file.

mv ha più capacità e opzioni. Guarda le opzioni nelle pagine man per ognuna per vedere le differenze nelle capacità. Diamo un'occhiata usando man in Ubuntu 18.04LTS (il tuo chilometraggio può variare a seconda della versione di ciascun pacchetto):

opzioni mv (omettendo la guida e la versione)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

rinominare le opzioni (omettendo la guida e la versione)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            

3
Definisci "più potente". Mv supporta regex come rinominare?
Gilles Quenot

Come affermato dall'interrogatore, no.
K7AAY

2
Wow, che argomento
Gilles Quenot

1
Dare credito dove è dovuto il credito.
K7AAY
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.