Rinomina tutti i file in una cartella con un prefisso in un unico comando


Risposte:


108

Se i nomi dei file non contengono spazi bianchi e non hai sottodirectory, puoi utilizzare un semplice forciclo:

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Altrimenti usa il comodo renamecomando (che è uno script perl) - sebbene potrebbe non essere disponibile immediatamente su ogni Unix (es. OS X non viene fornito con rename).

Una breve panoramica su debian-administration.org:

Se i nomi dei file contengono spazi bianchi è più facile da usare find, su Linux dovrebbe funzionare quanto segue:

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

-printfSfortunatamente sui sistemi BSD non ci sono opzioni. Ma findutils GNU dovrebbe essere installabile (ad esempio su Mac OS X con brew install findutils).

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

@Matteo: Grazie del suggerimento: aggiornato la mia risposta con un avvertimento più due esempi con find.
miku

Inoltre consiglierei for f in *; do [[ -f ${f} ]] && mv ...; donedi catturare solo i file (senza sottodirectory, collegamenti, ecc.) ...
twalberg

1
Se citi le variabili come dovresti, for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; donefunziona correttamente indipendentemente dai caratteri nei nomi dei file. Sposta anche directory, socket, collegamenti simbolici e altri tipi di file; Presumo che non abbia importanza.
Jonathan Leffler

In qualche modo questo ha aggiunto una .prima di tutti i miei file
nullability

77

Prova il rename comando nella cartella con i file :

rename 's/^/Unix_/' *

L'argomento di rename ( comando sed s ) indica di sostituire la regex ^ con Unix_ . L'accento circonflesso (^) è un carattere speciale che indica l' inizio della riga .


9
Potresti spiegare cosa 's/^/.../'significa?
mcont

@Matteo 's/^/.../'è l'argomento dell'espressione Perl per il comando rinomina
RoyalleBlue

Questo e spettacolare! Suggerirei di aggiungere la cartella / *, perché * è un po 'pericoloso se il comando viene ripetuto accidentalmente in un altro posto
Systems Rebooter

brew install rename @OliverPearmain
Felipe Plazas

Esempio per sostituire un prefisso:rename 's/^start_/run_' *
DenisKolodin

36

Penso che questo sia proprio quello che stai cercando:

ls | xargs -I {} mv {} Unix_{}

Sì, è semplice ma elegante e potente, e anche one-liner. Puoi ottenere un'introduzione più dettagliata da me nella pagina: Rinomina file e directory (Aggiungi prefisso)


2
Attenzione all'elaborazione dell'output di ls: può causare problemi se ci sono spazi o altri caratteri strani nei nomi dei file.
Jonathan Leffler

17

Di recente ho affrontato la stessa situazione e ho trovato una soluzione integrata più semplice. Lo condivido qui in modo che possa aiutare altre persone in cerca di una soluzione.

Con OS X Yosemite, Apple ha integrato le funzionalità di ridenominazione batch direttamente nel Finder. Informazioni dettagliate sono disponibili qui . Ho copiato anche i passaggi seguenti,

Rinomina più elementi

  1. Seleziona gli elementi, quindi fai clic tenendo premuto il tasto Ctrl su uno di essi.

  2. Nel menu di scelta rapida, seleziona Rinomina elementi.

  3. Nel menu a comparsa sotto Rinomina elementi cartella, scegli di sostituire il testo nei nomi, aggiungere testo ai nomi o modificare il formato del nome.

    • Sostituisci testo: inserisci il testo che desideri rimuovere nel campo Trova, quindi inserisci il testo che desideri aggiungere nel campo "Sostituisci con".

    • Aggiungi testo: inserisci il testo che desideri aggiungere nel campo, quindi scegli di aggiungere il testo prima o dopo il nome corrente.

    • Formato: scegli un formato del nome per i file, quindi scegli di inserire l'indice, il contatore o la data prima o dopo il nome. Immettere un nome nel campo Formato personalizzato, quindi immettere il numero con cui si desidera iniziare.

  4. Fare clic su Rinomina.

Se hai uno schema comune nei tuoi file, puoi usare Sostituisci testo, altrimenti anche Aggiungi testo farebbe il lavoro.


1
Eccellente - mi ha fatto risparmiare un sacco di tempo!
user3000868

7

Puoi semplicemente usare -iinvece di-I {}

ls | xargs -i mv {} unix_{}

Anche questo funziona perfettamente.

  • ls - elenca tutti i file nella directory
  • xargs- accetta tutti i file riga per riga grazie -iall'opzione
  • {}è il segnaposto per tutti i file, necessario se xargsottiene più di due argomenti come input

Utilizzando awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-iè deprecato, ora è solo-I
JamPow

mi ha aiutato su Debian 8.Thaks
Abror Esonaliev

2

Funziona anche per elementi con spazi e ignora le directory

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

Con rnm (dovrai installarlo):

rnm -ns 'Unix_/fn/' *

O

rnm -rs '/^/Unix_/' *

PS: sono l'autore di questo strumento.


2
Dovresti esaminare tutte le risposte sulla tua utilità e aggiungere la dichiarazione di non responsabilità che ne sei l'autore.
Mogsdad

@ Mogsdad: non credo sia quello di un'informazione necessaria. Se qualcuno vuole trovare l'autore, è abbastanza facile.
Jahid

Grazie per questo strumento. Per qualche motivo, renamenon funziona per me, ma rnmfunziona.
Aloso

0

Situazione:

Abbiamo certificate.key certificate.crtdentro/user/ssl/

Vogliamo cambiare titolo tutto ciò che inizia con certificateacertificate_OLD

Ora ci troviamo all'interno /user

Innanzitutto, fai una corsa a secco con -n:

rename -n "s/certificate/certificate_old/" ./ssl/*

Che ritorna:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

I tuoi file rimarranno invariati, questa è solo una prova.

Soluzione:

Quando sei soddisfatto del risultato del test, eseguilo sul serio:

rename "s/certificate/certificate_OLD/" ./ssl/*

Cosa significa:

`rinomina" s / QUALCOSA / QUALCOSA_ELSE "PERCORSO / FILE

Mancia:

Se sei già sul percorso eseguilo in questo modo:

rename "s/certificate/certificate_OLD/" *

O se vuoi farlo in qualsiasi sottodirectory che inizia con ssdo:

rename -n "s/certificat/certificate_old/" ./ss*/*

Puoi anche fare:

rename -n "s/certi*/certificate_old/" ./ss*/*

Che rinomina qualsiasi cosa che inizi con certiin qualsiasi sottodirectory che inizia conss .

Il cielo è il limite.

Gioca con le espressioni regolari e provalo SEMPRE PRIMA con -n.

ATTENZIONE QUESTO RINOMINERÀ ANCHE I NOMI DELLE CARTELLE CHE CORRISPONDONO. Meglio cdnella directory e farlo lì. USO A PROPRIO RISCHIO.


0

find -execdir rename

Questo rinomina file e directory con un'espressione regolare che influenza solo i nomi di base.

Quindi per un prefisso potresti fare:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

o per influenzare solo i file:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdir primo cd s nella directory prima di eseguire solo sul nome di base.

L'ho spiegato in modo più dettagliato su: Trova più file e rinominali in Linux

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.