파일 형식이 다른 약 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%%.*}
확장자가없는 파일 이름입니다. -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
할 수 배쉬의 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>
참고 : 내 접근 방식이 너무 복잡해 보입니다. 나는 당신의 장소에서 terdons 답변을 선호합니다.
명령 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
하여 파일 유형을 얻으십시오. 실제로 가치가 없어, 순수한 배쉬에서 훨씬 쉽게 수행하는 방법에 대한 내 대답을 참조하십시오.