2012-11-23 12 views
9

Ho familiarità con la rinomina ma ero curioso che la rinomina si applicasse ancora per la rimozione delle estensioni duplicate ??rimuovere le doppie estensioni in bash

Dire che ho un paio di file denominati:

  • picture2.jpg.jpg
  • picture9.jpg.jpg
  • picture3.jpg.jpg
  • picture6.jpg.jpg

Come rimuovere l'estensione duplicata ??

risultato

fine:

  • picture2.jpg
  • picture9.jpg
  • picture3.jpg
  • picture6.jpg

risposta

13

Assumendo:

  • È onl y vogliono eseguire questo nella directory di lavoro corrente formato (non ricorsivo)
  • Le doppie estensioni sono proprio come .jpg.jpg:

Poi il seguente script funziona:

#!/bin/bash 

for file in *.jpg.jpg 
do 
    mv "${file}" "${file%.jpg}" 
done 

Spiegazione:

Per utilizzare questo script:

  • Creare un nuovo file chiamato clean_de.sh in quella directory
  • Set a eseguibile chmod +x clean_de.sh
  • quindi eseguirlo da ./clean_de.sh

una nota di avvertimento:

Come @gniourf_gniourf hanno sottolineato, utilizzare l'opzione -n se il mv lo supporta.

Altrimenti - se avete a.jpg e a.jpg.jpg nella stessa directory, si rinominerà a.jpg.jpg-a.jpg e nel processo di ignorare il già esistente a.jpg senza preavviso.

+0

questo è esattamente ciò di cui avevo bisogno grazie. Presumo che il% \ sta facendo il cambiamento? –

+0

Se il tuo 'mv' ha l'opzione' -n' (nessuna opzione di clobber), puoi usarlo, solo per essere sicuro nel caso in cui il file di destinazione esista già. –

4

Una linea di comando di rinomina dovrebbe anche sufficiente (per il vostro caso, almeno):

rename 's/\.jpg\.jpg$/.jpg/' *.jpg.jpg 
1

Ecco una soluzione più generale, ma ancora facile per questo problema:

for oldName in `find . -name "*.*.*"`; do newName=`echo $oldName | rev | cut -f2- -d'.' | rev`; mv $oldName $newName; done 

Breve spiegazione:
find . -name "*.*.* - questo troverà solo i file con estensioni duplicate ricorsivamente

echo $oldName | rev | cut -f2- -d'.' | rev - il trucco accade qui: il comando rev fa un reverse sulla stringa, così ora puoi vedere che vuoi l'intero nome del file dal primo punto. (Gpj.gpj.fdsa)

mv $oldName $newName - per rinominare i file in realtà

Note di rilascio: dal momento che è un semplice script di una riga, è possibile trovare non gestita casi. File con un punto in più nel nome del file, strutture di directory super-profonde, ecc.

Problemi correlati