Shell
如何使用適當的副檔名重命名錯誤命名的文件?
我有一個文件夾,其中包含大量不同類型的文件,即*.pdf*、.jpg、.png、.tiff等,但都以副檔名*.JPG命名。如何使用原始副檔名重命名它們?即pdf到pdf*,tiff到tiff等等。
我可以通過以下方式找到文件類型:
file 99.jpg 99.jpg: PDF document, version 1.3
是否有任何腳本或程序可以做到這一點?
- 生成命令而不執行它們。
用於
mimetype
生成命令字元串列表,然後由GNUsed
的替代s
命令對其進行調整:cd ~/messed/up/folder/ # go where the files are... mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG | sed 's#\.[^./"]*/\([^./]*"\)$#\.\1#'
- 如果某些文件副檔名看起來有點過於mime -ish,(即,
.jpeg
而不是.jpg
等),則在ands
之間添加所需數量的命令,例如:sed '``s
sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\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
在您對結果滿意時取消註釋該行。