Shell

如何使用適當的副檔名重命名錯誤命名的文件?

  • June 2, 2017

我有一個文件夾,其中包含大量不同類型的文件,即*.pdf*、.jpg.png.tiff等,但都以副檔名*.JPG命名。如何使用原始副檔名重命名它們?即pdfpdf*,tifftiff等等。

我可以通過以下方式找到文件類型:

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

是否有任何腳本或程序可以做到這一點?

  1. 生成命令而不執行它們。

用於mimetype生成命令字元串列表,然後由GNU sed替代 s命令對其進行調整:

cd ~/messed/up/folder/  # go where the files are...
mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
  sed 's#\.[^./"]*/\([^./]*"\)$#\.\1#'
  1. 如果某些文件副檔名看起來有點過於mime -ish,(即, .jpeg而不是.jpg等),則在ands之間添加所需數量的命令,例如:sed '``s
sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#'
  1. 一旦輸出看起來不錯,使用GNU sed評估 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

您可以使用通過以下方式找到的 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在您對結果滿意時取消註釋該行。

引用自:https://unix.stackexchange.com/questions/368499