2015-06-06 42 views
5

Mam zatem folder z tysiącami plików graficznych, wszystkie zapisane jako .jpg.Zmień nazwę zestawu obrazów PNG z rozszerzeniem ".jpg" na ".png"

Problem polega na tym, że niektóre z tych plików są w rzeczywistości plikami obrazów PNG, więc nie otwierają się w wielu programach, chyba że ręcznie zmienię ich rozszerzenie na .png. Na przykład, obraz widz Ubuntu rzuca ten błąd:

"Error interpreting JPEG image file (Not a JPEG file: starts with 0x89 0x50)"

Już prowadził hexdump niektórych z tych plików, aby potwierdzić ten błąd i sprawdza się.

Szukam prostego sposobu na znalezienie wszystkich plików o złym rozszerzeniu wśród innych plików i zmianę ich rozszerzenia. Jak na przykład zrobiłbym to przy pomocy skryptu Bash? Do tej pory nie mam pojęcia. Cała pomoc została doceniona!

Odpowiedz

6
for f in *.jpg ; do 
    if [[ $(file -b --mime-type "$f") = image/png ]] ; then 
    mv "$f" "${f/%.jpg/.png}" 
    fi 
done 

ten uzyskuje listę .jpg plików, a następnie dla każdego wywołuje narzędzie file na to, aby uzyskać typ MIME. Jeśli to jest image/png, to zmienia nazwę pliku, zastępując string manipulation.

0

Nie jestem pewien odpowiednich poleceń dla skryptu bash, ale można łatwo napisać plik C++, aby spróbować otworzyć te pliki i złapać błąd. Pliki, w których wykryto błąd, nie będą odpowiednie (zakładając, że to jedyny problem). Jeśli wiesz, że te nieprawidłowe typy plików powinny być w formacie PNG, możesz zmienić nazwę pliku. Coś jak Pseudokod:

For (ALL_FILES) 
{ 
    try 
    { 
    open(FILENAME); 
    } 
    catch 
    { 
    rename(FILENAME, NEW_FILENAME); 
    } 
} 
+1

Zakłada to "otwarte" próby * przetwarzania * danych pliku * i *, które zależą od rozszerzenia pliku, aby było poprawne. Proste "ogólne" 'otwarte' zawsze zakończy się powodzeniem na istniejącym pliku. "Inteligentne" 'otwarte' zignoruje rozszerzenie pliku i użyje [magicznego podpisu] pliku (http://en.wikipedia.org/wiki/List_of_file_signatures), aby określić jego typ i dlatego może się powieść. – usr2564301

1

Chcesz użyć file i analizować dane wyjściowe. Można sprawdzić, czy jest to JPEG lub PNG sprawdzając początkową część produkcji:

F="filename.jpg" 
TYPE=$(file -b $F) 
[[ $TYPE == JPEG\ image\ data* ]] && echo "jpg" 
[[ $TYPE == PNG\ image\ data* ]] && echo "png" 

można zmienić rozszerzenie przez odpędzenie .jpg z basename. Na przykład, następujące zmienić rozszerzenie pliku z rozszerzeniem .jpg$F do .png:

mv $F $(dirname $F)/$(basename $F .jpg).png 
1

Po pierwsze uzyskać listę plików i uczynić je w pliku. Następnie przetwórz listę do pętli, aby automatycznie zmieniać pliki.

#!/bin/bash 

FILE=/tmp/list ## Assuming the list of files are in this file. 
for file in $(cat $FILE); do 
    OLD_FILE=$file 
    NEW_FILE=$(echo $file|sed -e 's/jpg$/png/') 
    mv $OLD_FILE $NEW_FILE 
done 
1

Użyj file (1), aby określić typ wszystkich plików. Użyj filtru grep (1), aby usunąć wszystkie właściwe pliki JPEG. Pozostaje lista plików, których nie można rozpoznać jako JPEG.

w jednej linii

file *.jpg | grep -v "JPEG image data" 

- upewnij się, aby sprawdzić, czy rzeczywiście jest to co JPEG image datafile powraca na poprawnie zidentyfikowane pliku JPG.

Można użyć sed (1) usunąć rzeczy po dwukropku : i kończy się tylko nazwa pliku:

file *.jpg | grep -v "JPEG image data" | sed 's/:.*//' 

.. który jest koniec mojego bash-fu.W tym momencie zapisałbym wynikową listę w pliku (dodaj > list) i użyj GREP w edytorze tekstów, aby przepisać wszystkie wiersze na odpowiednie polecenie zmiany nazwy, a następnie uruchom to.