Rinominare i file in Linux con una regex


9

Ho avuto un gruppo di file che vorrei rinominare in modo coerente, i file sono chiamati cose come

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

E li volevo come estensione minuscola, yyyymmdd, .log

"system.20090101.log"
"something.20090101.log"

Risposte:


14

Per fare ciò scrivevo script perl, fino a quando non ho scoperto il comando rename.

Accetta un regex perl per fare il nome:

per questo, ho appena digitato due comandi:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Per alcune distro, tuttavia, renamenon dispone di questa funzionalità (vedere la sua pagina man) e potrebbe essere necessario installare perl-renameo prename.


risposta molto bella
Judioo,

8
Attenzione, alcune distro inviano un comando di ridenominazione senza valore. Controlla qual è la tua distro prima.
derobert,

Lo sapevo, mmvma alla fine grazie a renameposso usare il potere del regex
Ludovic Kuty il

5
Su Arch Linux questo è perl-rename.
Oleh Prypin,

6

Dal momento che non ho un comando di ridenominazione, mi affido a questo:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done

5

mmv è un'utilità standard di Linux per spostare / rinominare più file. È disponibile nei repository per la maggior parte delle distribuzioni. Per il tuo esempio sopra, potresti fare:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Per maggiori informazioni, leggi questo articolo di debaday o la pagina man .


5

renameutil non è molto "standard". Ogni distribuzione viene fornita con uno renamestrumento diverso . Ad esempio, qui su Gentoo, renameproviene dal sys-apps/util-linuxpacchetto e non supporta regex.

Hamish Downer ha suggerito mmv, sembra utile, specialmente per l'uso all'interno degli script.

D'altra parte, per il caso generale, potresti voler rinominare . Ha qmve qcpcomandi, che apriranno un editor di testo a tua scelta (la mia preferenza: Vim) e ti consentiranno di modificare i nomi dei file di destinazione lì. Dopo aver salvato e chiuso l'editor, qmv/ qcpeseguirà la ridenominazione.

Entrambi mmve qmvsono abbastanza intelligente per rinominare file in ordine corretto e anche di rilevare rinomina circolari, e verrà automaticamente fare un file temporaneo, se necessario.


Su Gentoo puoi anche emergere il sys-apps/renamepacchetto, che ti dà renamexmche farà rinominare regex così come mass maiuscole / minuscole e altre cose carine.
radicand,

1

Ad essere onesti:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

dà questo risultato:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Ma:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

dà il giusto output:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

sostituendo l'opzione {-n} con {-v}


1

Ho creato un piccolo script bash per fare questo:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

In generale l'analisi lsdell'output non è la migliore idea. Una ricerca casuale tirò su questa lunga lettura su Unix. SE per il tuo divertimento. | Inoltre, la tua risposta corrisponderebbe meglio alla domanda con:tr '[:upper:]' '[:lower:]'
HBruijn,
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.