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

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

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

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

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

  • Как сделать вывод для grep неудачным?
  • Объясните команду оболочки: shift $ (($ optind - 1))
  • Как заставить команду «mail» работать с помощью SSH?
  • Переменная среды $ PATH, по-видимому, не распознается
  • Сравните наборы значений из двух файлов и распечатайте вывод в третьем файле с помощью awk
  • bash: невозможно создать временный файл для здесь-документа: на устройстве нет места
  • Почему массив пуст после цикла while?
  • Как установить переменные среды другого процесса?
  • 2 Solutions collect form web for “Как переименовать неназванные файлы с соответствующими расширениями?”

    1. Создавайте команды, не запуская их.

      Используйте mimetype для генерации списка командных строк, который впоследствии будет изменен командой замены GNU sed :

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

       sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#' 
    3. Как только результат будет выглядеть хорошо, запустите его с помощью опции оценки GNU sed . (Просто положите 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 

    Вы можете использовать тип 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 когда вы довольны результатами.

    Linux и Unix - лучшая ОС в мире.