Come rinominare in blocco i file in nomi di file numerici in Linux

Contenuti

Vuoi rinominare un intero set di file in una sequenza numerica? (1.PDF, 2.PDF, 3.PDF,…) en Linux? Questo può essere fatto con alcuni script leggeri e questo post ti mostrerà come fare esattamente questo.

Nomi di file numerici

Generalmente, quando eseguiamo la scansione di un file PDF con dell'hardware (cellulare, scanner PDF dedicato), il nome del file leggerà qualcosa del genere 2020_11_28_13_43_00.pdf. Molti altri sistemi semiautomatici producono nomi di file simili in base a data e ora.

Qualche volta, il file può contenere anche il nome dell'applicazione che viene utilizzata, o qualche altra informazione come, come esempio, il DPI (punti per pollice) formato carta applicabile o scansionato.

Quando si raccolgono file PDF da fonti diverse, le convenzioni di denominazione dei file possono differire in modo significativo e potrebbe essere utile standardizzare su un nome file numerico (o numerico in parte).

Questo vale anche per altri domini e set di file. Come esempio, le tue ricette o la tua raccolta di foto, campioni di dati generati in sistemi di monitoraggio automatizzati, file di registro pronti per l'archiviazione, un set di file SQL per l'ingegnere del database e, generalmente, tutti i dati raccolti da fonti diverse con schemi di denominazione diversi.

Rinomina i file di massa in nomi di file numerici

En Linux, è facile rinominare rapidamente un intero set di file con nomi di file completamente diversi, a una sequenza numerica. "Facile" significa "facile da eseguire" qui: il problema di rinominare i file in numeri numerici è complesso da codificare: lo script in linea di seguito ha preso da 3 un 4 ore per indagare, creare e testare. Molti altri comandi testati, avevano tutti dei limiti che volevo evitare.

Si prega di notare che non vengono fornite o fornite garanzie, e questo codice è fornito “così com'è”. Fai le tue ricerche prima di correre. Avendo detto questo, L'ho testato con successo su file con alcuni caratteri speciali, e anche contro più di 50k file senza perdere alcun file. Ho anche controllato un file chiamato 'a'$'n''a.pdf' contenente una nuova riga.

Se [ ! -r _e -a ! -r_c ]; quindi echo 'pdf' > _e; eco 1 > _C ;trova . -nome "*.$(gatto _e)" -print0 | xargs -0 -io{} bash -c 'mv -n "{}" $(gatto _c).$(gatto _e);eco $[ $(gatto _c) + 1 ] > _C'; rm -f _e _c; essere

Vediamo prima come funziona e poi analizziamo il comando. Abbiamo creato una directory con otto file, tutte con nomi molto diversi, tranne che la sua estensione corrisponde ed è .PDF. Prossimo, eseguiamo il comando precedente:

Rinomina i file di massa in nomi di file numerici in Linux

Il risultato è stato che 8 i file sono stati rinominati in 1.pdf, 2.PDF, 3.PDF, eccetera., anche se i loro nomi erano piuttosto spostati prima.

Il comando presuppone che tu non ne abbia nessuno 1.PDF per x.pdf file denominati ancora. Se lo fa, puoi spostare quei file in una directory separata, impostare il echo 1 a un numero più alto per iniziare a rinominare i file rimanenti a un dato offset, e in seguito unire nuovamente le due directory.

Fare sempre attenzione a non sovrascrivere alcun file, ed è sempre una buona idea fare un rapido backup prima di aggiornare qualsiasi cosa.

Vediamo il comando in dettaglio. Puoi aiutare a vedere cosa sta succedendo aggiungendo il -t opzione a xargs che ci permette di vedere cosa succede dietro le quinte:

xargs con l'opzione -t ci permette di vedere cosa sta succedendo durante il processo di ridenominazione

Iniziare, il comando usa due piccoli file temporanei (chiamato _me e _C) come deposito temporaneo. All'inizio dell'eyeliner, Fai un controllo di sicurezza usare un if dichiarazione per garantire che entrambi _me e _C i file non sono presenti. Se c'è un file con quel nome, lo script non continuerà.

Sul tema dell'utilizzo di piccoli file temporanei rispetto alle variabili, posso dire che, anche se l'uso delle variabili sarebbe stato l'ideale (risparmia un po' di E / disco S), c'erano due problemi che stavo incontrando.

Il primo è che se esporti una variabile all'inizio del liner e successivamente usi quella stessa variabile in seguito, se un altro script usa la stessa variabile (incluso questo script che viene eseguito più di una volta contemporaneamente sulla stessa macchina), quindi quel copione, ovest, potrebbe essere influenzato. È meglio evitare tali interferenze quando si tenta di rinominare molti file!!

Il secondo era quello xargs in combinazione con bash -c sembra avere una limitazione nella gestione delle variabili all'interno del bash -c riga di comando. Anche un'ampia ricerca online non ha fornito una soluzione praticabile per questo.. Perché, ho finito per usare un piccolo file _C che mantengono il progresso.

_me È l'estensione che cercheremo e utilizzeremo, e _C è un contatore che aumenterà automaticamente ad ogni cambio di nome. il echo $[ $(cat _c) + 1 ] > _c il codice si occupa di questo, mostrando il file con cat, aggiungendo un numero e riscrivendolo.

Il comando utilizza anche il miglior metodo possibile per gestire caratteri speciali di nomi di file utilizzando la terminazione null invece della terminazione di nuova riga standard, In altre parole, il carattere. Ciò è assicurato dal -print0 opzione a find, e per lui -0 opzione per xargs.

Il comando di ricerca cercherà qualsiasi file con l'estensione specificata nel _me file (creato da echo 'pdf' > _e comando. Puoi variare questa estensione con qualsiasi altra estensione che desideri, ma non anteponerlo con un punto. Il punto è già incluso nell'ultimo *.$(cat _e) -name specificatore per find.

Una volta trovato, hanno individuato tutti i file e li hanno inviati: finito di xargs, xargs rinominerà i file uno per uno usando il file contatore (_C) e la stessa estensione di file (_me). Per ottenere il contenuto dei due file, Un semplice cat il comando è usato, in esecuzione dall'interno di un sottolivello.

il mv usa il comando di spostamento -n per evitare di sovrascrivere eventuali file già presenti. Infine puliamo i due file temporanei eliminandoli.

Sebbene il costo dell'utilizzo di due file di stato e della ramificazione del sottolivello possa essere limitato, questo aggiunge un po' di sovraccarico allo script, soprattutto quando si ha a che fare con un gran numero di file.

Ci sono tutti i tipi di altre soluzioni per questo stesso problema online, e molti hanno provato e fallito a creare una soluzione completamente funzionante. Molte soluzioni hanno dimenticato tutti i tipi di valigie laterali, come usare ls Non specificato --color=never, che può portare all'analisi di codici esadecimali quando si utilizza la codifica a colori dell'elenco delle directory.

Nonostante questo, altre soluzioni hanno saltato la gestione dei file con spazi, nuove righe e caratteri speciali, ad esempio ” correttamente. Per questo, la combinazione find ... -print0 ... | xargs -0 ... è generalmente indicato e ideale (ed entrambi i circostanze e xargs i manuali alludono a questo fatto abbastanza fortemente).

Anche se non considero la mia implementazione la risposta perfetta o definitiva, sembra essere un progresso significativo per molte delle altre soluzioni là fuori, quando si usa find e catene finite, messa in sicurezza nome file massimo e supporto per l'analisi, pur avendo altre accortezze, come specificare a spostamento inizialeed essere totalmente nativo di bash.

Godere!

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.