Rinomina tutti i file all'interno di una cartella con prefisso "Unix_"
Supponiamo che una cartella abbia due file
a.txt
b.pdf
quindi entrambi dovrebbero essere rinominati da un singolo comando a
Unix_a.txt
Unix_b.pdf
Rinomina tutti i file all'interno di una cartella con prefisso "Unix_"
Supponiamo che una cartella abbia due file
a.txt
b.pdf
quindi entrambi dovrebbero essere rinominati da un singolo comando a
Unix_a.txt
Unix_b.pdf
Risposte:
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
find.
for f in *; do [[ -f ${f} ]] && mv ...; donedi catturare solo i file (senza sottodirectory, collegamenti, ecc.) ...
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.
.prima di tutti i miei file
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 .
's/^/.../'significa?
's/^/.../'è l'argomento dell'espressione Perl per il comando rinomina
rename 's/^start_/run_' *
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)
ls: può causare problemi se ci sono spazi o altri caratteri strani nei nomi dei file.
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
Seleziona gli elementi, quindi fai clic tenendo premuto il tasto Ctrl su uno di essi.
Nel menu di scelta rapida, seleziona Rinomina elementi.
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.
Fare clic su Rinomina.
Se hai uno schema comune nei tuoi file, puoi usare Sostituisci testo, altrimenti anche Aggiungi testo farebbe il lavoro.
Puoi semplicemente usare -iinvece di-I {}
ls | xargs -i mv {} unix_{}
Anche questo funziona perfettamente.
ls - elenca tutti i file nella directoryxargs- accetta tutti i file riga per riga grazie -iall'opzione{}è il segnaposto per tutti i file, necessario se xargsottiene più di due argomenti come inputUtilizzando awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-iè deprecato, ora è solo-I
Funziona anche per elementi con spazi e ignora le directory
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Con rnm (dovrai installarlo):
rnm -ns 'Unix_/fn/' *
O
rnm -rs '/^/Unix_/' *
PS: sono l'autore di questo strumento.
renamenon funziona per me, ma rnmfunziona.
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.
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