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:
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:
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