さまざまなファイルタイプの画像が約12000個ありますが、それらはすべて* .jpgという名前に変更されました。
今、私は彼らに適切な拡張子を返したいです、どうすればいいですか
さまざまなファイルタイプの画像が約12000個ありますが、それらはすべて* .jpgという名前に変更されました。
今、私は彼らに適切な拡張子を返したいです、どうすればいいですか
回答:
あなたはbashで比較的簡単にそれを行うことができます:
for f in *jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
これは@ABの答えと同じ考えですが、の代わりにシェルグロブを使用しますfind
。${f%%.*}
その拡張子を除いたファイル名です。コマンドは、それが印刷になり、我々は、その後に使用するファイル名の後にファイルタイプ。これは、スペース、改行などを含む任意のファイル名で機能するはずです。これは、小文字の拡張子を取得するための秘isです。に変換されます。-0
file
\0
grep
${type,,}
PNG
png
あなたは質問で言っていませんでしたが、これを再帰的にしてサブディレクトリに降りる必要がある場合は、代わりにこれを使用できます:
shopt -s globstar
for f in **/*jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
shopt -s globstar
することができますbashののglobstarオプション有効になります**
試合のサブディレクトリを:
グロブスター
設定されている場合、パス名拡張コンテキストで使用されるパターン**は、すべてのファイルと0個以上のディレクトリとサブディレクトリに一致します。パターンの後に/が続く場合、ディレクトリとサブディレクトリのみが一致します。
**
サブディレクトリに再帰することができます。
file
、拡張子を常に指定しているわけではありませんがfoo.bourne-again
、たとえばbashファイルをここに変換しているようです!
以下のスクリプトを使用して、間違って設定された拡張子を.jpg
正しい名前に(再帰的に)変更できます。判読できないファイルが見つかった場合、スクリプトの出力で報告します。
スクリプトが使用するimghdr
次のタイプを認識するために、モジュールを:rgb
、gif
、pbm
、pgm
、ppm
、tiff
、rast
、xbm
、jpeg
、bmp
、png
。imghdr
モジュールの詳細はこちら。リンクで説明されているように、リストはより多くのタイプで拡張できます。
そのまま.jpg
で、質問で述べたように、特に拡張子が付いたファイルの名前を変更します。わずかな変更を加えると、任意の拡張子または特定の拡張子のセットを正しい拡張子に変更することができます(または、ここにあるような拡張子なし)。
#!/usr/bin/env python3
import os
import imghdr
import shutil
import sys
directory = sys.argv[1]
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
# find files with the (incorrect) extension to rename
if name.endswith(".jpg"):
# find the correct extension
ftype = imghdr.what(file)
# rename the file
if ftype != None:
shutil.move(file, file.replace("jpg",ftype))
# in case it can't be determined, mention it in the output
else:
print("could not determine: "+file)
rename.py
次のコマンドで実行します:
python3 /path/to/rename.py <directory>
注:私のアプローチは複雑すぎるようです。私はあなたの代わりに返事を好むでしょう。
コマンドfile
を使用して、ファイルタイプを判別できます。
% file 20050101_14-24-37_330.jpg
20050101_14-24-37_330.jpg: JPEG image data, EXIF standard 2.2, baseline, precision 8, 1200x1600, frames 3
% file test.jpg
test.jpg: PNG image data, 1192 x 774, 8-bit/color RGBA, non-interlaced
この情報を使用して、ファイルの名前を変更できます。
コマンドを画像に適用する前にテストを行ってください
find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} |
awk -F " image data" '{print $1}' |
awk -F"<separator> " '{
system("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)
}'
例
% find . -type f -name "*.jpg"
./test.jpg
./sub/20050101_14-24-37_330.jpg
% find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | awk -F " image data" '{print $1}' | awk -F"<separator> " '{system ("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)}'
% find . -type f -iname "*"
./test.PNG
./sub/20050101_14-24-37_330.JPEG
find -exec bash -c "..."
してすべてを実行するか、またはを使用while read -d '' name type
してファイル名とfile
出力を分割し、解析$type
してファイルタイプを取得します。本当に価値はありません。純粋な(bish)bashでもっと簡単に行う方法については私の答えをご覧ください。