C'è un command Linux come mv ma con regex?

Per esempio voglio mv (.*?).sql $1.php ,

c'è un command che mi permette di specificare i templates di ridenominazione?

Come altri hanno menzionato, la rename è buona a questo, ma leggere la pagina man rename ( man rename ) prima di provarlo. Ci sono alless due strumenti completamente diversi che si chiamano rename e che uno dipenderà dalla distribuzione. Chiamandoli in modo errato può essere pericoloso.

Ecco la pagina dell'uomo per la versione perl di Larry Wall che viene fornita con Ubuntu. Le date un'espressione perl come rename 's/\.sql$/.php/' *.sql

Ecco la pagina man per la ridenominazione che viene fornita con le vecchie distribuzioni Red Hat e CentOS. L'utilizzo è una semplice sostituzione di stringhe come rename .sql .php *.sql

È inoltre ansible utilizzare un bash one-liner per elaborare each file uno alla volta:

 $ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done 

C'è la rename(1) , che non utilizza regex, ma può risolvere il problema:

 rename .sql .php *.sql 

C'è anche mmv(1) , ma non conosco come funziona.

Buongiorno,

Si potrebbe anche provare a entrare

 for i in $(\ls -d *.sql) do mv $i $(echo $i | sed -e 's/\.sql$/\.php/') done 

Oppure, per farlo usare, cambiare leggermente il regex

 for i in $(\ls -d | egrep -e '.*\.sql') do mv $i $(echo $i | sed -e 's/\.sql$/\.php/') done 

per un po 'di funzionalità di shell coding. (-:

Installare mmv , quindi eseguire questa operazione:

 mmv "*.sql" "#1.php" 

Essere un idraulico, mi piace tubi 🙂

Nota: questa risposta è verbosa – come una novella, lo apprezzo quando qualcuno che conosce prende il tempo di spiegare, quindi pago 'in avanti'. Se non sei un nuovo, scusate la lunghezza e la verbosità.

 ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash 

Dove:

 ls -1 *_201[67][0-9]* 

elenca tutti i file corrispondenti al model, in questo caso cerco i file con la data nel nome del file nel formato 'YYYYMMDD'

 sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' # : | | | | | | | |: : # : |^2....^ ^3..................^^4.......^ |: : # :^1..............................................................^: : # /................filename.................pattern................./...mkdir...and....mv...command.../ 

^ 1: primo gruppo di cattura – l'integer nome di file

^ 2: secondo gruppo di cattura – la prima parte del model di filename

^ 3: gruppo di cattura 3 – la seconda parte del file – qui, la data come 'YYYYMMDD'

^ 4: quarto gruppo di cattura – parte opzionale del nome del file tra la data e l'estensione e l'estensione stessa

Sooooo …. se ho un file chiamato

 CallLog_555123412_20161231-214403.7z 

…poi

 mkdir -p \2\/\3; mv \1 \2\/\3\/\1 

in realtà significa

 # make directory and sub-directory mkdir -p CallLog_555123412/20161231 # move file from current directory to sub-sub-directory just created mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z 

Si noti che l'output del command sed è piped attraverso a 'bash' per eseguirlo. Per vedere prima che il file proposto si muove SENZA effettivamente spostandoli, rimuovi la '| bash 'alla fine, e provalo così:

 ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' 

Questo non farà alcuna modifica, ma vedrai il command che verrà eseguito se lo si esegue con '| bash 'contrassegnato alla fine.

Ciò è utile poiché è ansible creare qualsiasi sotto-directory che desideri da parti nel nome del file o qualsiasi altra cosa che aggiungi al text "sostituzione" nel command sed. Si noti che sed però richiede molti caratteri di escape.

Staffe SED Regex:

(…) richiedono la fuga per il raggruppamento di cattura -> \ (… \)

{m, n} richiedono la fuga per la quantificazione dell'object precedente -> \ {m, n \}

/ richiede la fuga nella string di sostituzione -> \ /

[…] NON necessità di fuggire per classi di carattere

\ 1 nella string di sostituzione si riferisce al primo gruppo catturato, e così via …

AVVERTENZA DI SICUREZZA: MAI NON TIPI QUALSIASI COME "BISCOTTO" A less che tu abbia pienamente apprezzato il risultato …

Spero che aiuta a cancellare alcuni blocchi 🙂