Правильные расширения файлов

У меня есть около 12000 изображений разных типов файлов, но каждое из них было переименовано в * .jpg.

Теперь я хочу вернуть им их правильные расширения, как я могу это сделать

16
задан 10 June 2015 в 20:48

3 ответа

Можно сделать это относительно легко в ударе:

for f in *jpg; do 
    type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+') 
    mv "$f" "${f%%.*}.${type,,}"  
done

Это - та же идея как ответ @A.B, но использующий шарики оболочки вместо find. ${f%%.*} имя файла без его расширения. -0 из file команда заставляет его распечатать a \0 после имени файла, для которого мы затем используем grep тип файла. Это должно работать с произвольными именами файлов, включая тех, которые содержат пробелы, новые строки или что-либо еще. ${type,,} прием должен получить расширения нижнего регистра. Это преобразовало бы PNG кому: png.

Вы не сказали в своем вопросе, но если Вам нужно это, чтобы быть рекурсивными и убывать в подкаталоги, Вы могли бы использовать это вместо этого:

shopt -s globstar
for f in **/*jpg; do 
    type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+') 
    mv "$f" "${f%%.*}.${type,,}"  
done

shopt -s globstar включит globstar опцию удара, которая позволяет ** подкаталоги соответствия:

globstar

Если установлено, шаблон ** используемый в контексте расширения пути будет соответствовать всем файлам и нулю или большему количеству каталогов и подкаталогов. Если шаблон сопровождается/, только соответствие подкаталогов и каталоги.

23
ответ дан 10 June 2015 в 20:48

Сценарий ниже может использоваться, чтобы (рекурсивно) переименовать неправильно установленное расширение, .jpg, к корректному. В случае, если это находит нечитабельный файл, это сообщит об этом в выводе сценария.

Использование сценария imghdr модуль, для распознавания следующих типов: rgb, gif, pbm, pgm, ppm, tiff, rast, xbm, jpeg, bmp, png. Больше на imghdr модуль здесь. Список может быть расширен с помощью большего количества типов, как упомянуто в ссылке.

Как это, это конкретно переименовывает файлы с расширением .jpg, как упомянуто в вопросе. С незначительным изменением это может быть пригодно переименовать любое расширение или определенный набор расширений, в корректное (или без расширения, как здесь).

Сценарий:

#!/usr/bin/env python3
import os
import imghdr
import shutil
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for name in files:
        file = root+"/"+name
        # find files with the (incorrect) extension to rename
        if name.endswith(".jpg"):
            # find the correct extension
            ftype = imghdr.what(file)
            # rename the file
            if ftype != None:
                shutil.move(file, file.replace("jpg",ftype))
            # in case it can't be determined, mention it in the output
            else:
                print("could not determine: "+file)

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как rename.py
  2. Выполните его командой:

    python3 /path/to/rename.py <directory>
    
11
ответ дан 10 June 2015 в 20:48

Примечание: Мой подход, кажется, слишком сложен. Я предпочел бы ответ terdons в Вашем месте.

<час>

можно использовать команду file для определить тип файла:

% file 20050101_14-24-37_330.jpg 
20050101_14-24-37_330.jpg: JPEG image data, EXIF standard 2.2, baseline, precision 8, 1200x1600, frames 3

% file test.jpg
test.jpg: PNG image data, 1192 x 774, 8-bit/color RGBA, non-interlaced

С этой информацией, файлы могут быть переименованы:

сделайте тест перед применением команды к изображениям

find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | 
 awk -F " image data" '{print $1}' | 
  awk -F"<separator> " '{
   system("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)
   }'
<час>

Пример

% find . -type f -name "*.jpg"
./test.jpg
./sub/20050101_14-24-37_330.jpg

% find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | awk -F " image data" '{print $1}' | awk -F"<separator> " '{system ("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)}'

% find . -type f -iname "*"    
./test.PNG
./sub/20050101_14-24-37_330.JPEG
0
ответ дан 10 June 2015 в 20:48

Другие вопросы по тегам:

Похожие вопросы: