Как переименовать неправильно названные файлы, присвоив им соответствующие расширения?

Как переименовать неправильно названные файлы, присвоив им соответствующие расширения?

У меня есть папка с большим количеством файлов разных типов, например.pdf,.jpg,.png,.тиффи т. д., но все они имеют расширение.JPG. Как мне переименовать их все, сохранив их оригинальные расширения?pdfкpdf,размолвкакразмолвкаи так далее.

Я могу найти тип файла по:

file 99.jpg
99.jpg: PDF document, version 1.3

Есть ли какой-нибудь скрипт или программа, с помощью которой я могу это сделать?

решение1

Вы можете использовать тип MIME, найденный file:

#! /usr/bin/env bash
for f in ./*.JPG; do
    type=$(file -bi "$f")
    type=${type%%;*}
    base=${f%.*}
    final=
    case "$type" in
        application/pdf) final="$base".pdf ;;
        image/png)       final="$base".png ;;
        image/tiff)      final="$base".tiff ;;
    esac
    if [ "$final" ]; then
        printf '%s --> %s\n' "$f" "$final"
        # mv -f "$f" "$final"
    fi
done

Добавьте больше типов в , caseесли вам нужно (но не добавляйте image/jpeg, так как файлы JPEG уже имеют правильное расширение). Просмотрите изменения, затем раскомментируйте строку, mvкогда будете довольны результатами.

решение2

  1. Сгенерировать командыбезуправляя ими.

    Используется mimetypeдля создания списка командных строк, который затем настраиваетсяГНУ sed'sзаменять sкоманда:

    cd ~/messed/up/folder/  # go where the files are...
    mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
       sed 's#\.[^./"]*/\([^./]*"\)$#\.\1#'
    
  2. Если некоторые расширения файлов выглядят слишкомпантомима-ish, (т.е. .jpegвместо , и т.д.), затем добавьте необходимое .jpgколичество команд между и , например:ssed 's

    sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#'
    
  3. Как только вывод станет хорошим, запустите его с помощьюГНУ sed's оценивать eвариант. (Просто поставьте eперед финальным '.) Таким образом, все это может выглядеть так:

    cd ~/messed/up/folder/  # go where the files are...
    mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
        sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#e'
    ls  # show results
    

Связанный контент