У меня есть папка с большим количеством файлов разных типов, например.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
Сгенерировать командыбезуправляя ими.
Используется
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#'
Если некоторые расширения файлов выглядят слишкомпантомима-ish, (т.е.
.jpeg
вместо , и т.д.), затем добавьте необходимое.jpg
количество команд между и , например:s
sed '
s
sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#'
Как только вывод станет хорошим, запустите его с помощьюГНУ
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