bash를 사용하여 파일에 파일 확장자 추가


94

bash를 사용하여 확장자가없는 파일에 파일 확장자 ".jpg"를 추가하는 좋은 방법은 무엇입니까?


3
mv "${file}" "${file}.jpg"?
onteria_

2
"확장없는 파일"이란 무엇입니까? 이름에 점이없는 파일입니까?
glenn jackman

답변:


118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
두 번째는 확장명이없는 파일의 이름을 바꾸는 데 적합합니다! 감사!
anon58192932 2014 년

2
두 번째는 모든 파일, 단지 확장명이없는 사람에 확장을 추가
제프

5
참고 "${f%.jpg}"로 bash 쉘 문자열 조작입니다. `$ {string % substring}`$ string 뒤에서 $ substring의 가장 짧은 일치를 삭제합니다.
Jichao

경고 : 확장명이 혼합 된 폴더가있는 경우 위의 .jpg내용이 일반 파일에도 추가된다는 점에 유의하십시오 .
sachinruk

61

이름 바꾸기를 사용할 수 있습니다.

rename 's/(.*)/$1.jpg/' *

3
어떤 버전의 이름 바꾸기를 사용하고 있습니까? 저의 주장은 다릅니다.rename from to file...
B Johnson

1
rename은 버전 5.10.1 인 perl에 포함되어 있습니다.
Kim Stebel

3
이것은 Ubuntu에 포함 된 이름 바꾸기와 함께 훌륭하게 작동합니다 (그래서 모든 Debian 기반 배포판을 추측하고 있습니다), jm666의 대답보다 훨씬 덜 장황합니다.
Roger Heathcote

28

또 다른 방법-루프없이

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

고장:

  • 확장자가없는 모든 파일 찾기
  • 파일 유형 확인
  • JPG 파일 만 필터링
  • 파일 유형 정보 삭제
  • xargs는 각 파일에 대해 "mv"를 실행합니다.

위의 명령은 드라 이런을 위한 것이므로 mv 전에 "echo"를 제거해야합니다.

편집 여기에 "따옴표로 경로 인수를 줄 바꿈; 공백이있는 경로에서 인수 분할을 방지" 가 필요하다고 제안하는 사람들이 있습니다 .

일반적으로이 권장 사항은 사실이지만이 경우에는 그렇지 않습니다. 여기서이 때문에 %대체되었다되어 있지 쉘 확장이 아니라하여 xargs(가), 그래서 내부 (직접) %에도 파일명에 공백이 올바르게 치환한다.

간단한 데모 :

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...

이것을 루프에 넣을 수 있으며이 xargs는 불필요합니다. 이 상황에서 Ryan의 대답이 더 좋습니다.
Lucius

1
@Lucius-btw, 질문은 "확장없는"파일을 원하므로 Ryan은 해당 파일 만 찾아야합니다 ...
jm666

@ jm666 안녕하세요! 폴더에있는 모든 확장자가없는 파일의 이름을 각각의 확장자로 바꾸려면 코드 스 니펫을 어떻게 수정합니까? (I 파일 -b $ 파일 이름 명령으로 올바른 확장을 감지하고있다.)
Soumyajit

24

간단하게 파일이있는 디렉토리로 이동하십시오.

for f in *;do mv $f $f.jpg;done

어떤 이유로 이것은 나를 위해 작동하지만 따옴표가있는 Seth의 솔루션은 그렇지 않습니다. (OSX Mountain Lion bash)
delrocco

4
for f in *;do mv "$f" "$f".jpg;done파일 이름에 공백을 지원 하는 데 사용 하면 더 좋을 것 입니다.
Hritik

이 우아하고 간단한 솔루션에 감사드립니다.이 답변에 여러 번 도착했지만 암기하지 못하는 것 같습니다. #dejavu
팀 안데르센

15

드라 이런 :

 rename -n s/$/.jpg/ *

실제 이름 변경 :

 rename s/$/.jpg/ *

6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

1

제 경우에는 파일 유형을 인식하지 못했기 때문에 파일 명령 의 도움으로 mv 명령을 사용 하여 파일 유형을 검사하고 찾을 수 있습니다. 이 솔루션은 파일 명령이 파일 유형을 인식하지 못할 수 있기 때문에 모든 파일에 완벽하지 않을 수 있지만 대부분 저에게 효과적이었습니다.

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

awk의 사용 은 실제로 확장 인 명령 파일 에서 반환 된 문자열의 두 번째 단어를 제거하는 것입니다.


jpg 및 png를 자동으로 처리합니다. 그것을 사용하고 작동합니다-대단히 감사합니다! 이제 확장은 CAPS입니다. 그래도 작은 문제 :)
krivar

0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename

--dry-run그리고 -a내 버전에서 사용할 수 없습니다 rename. 이것이 일부 아키텍처에 특정한 경우이를 지정해야합니다.
페르난도 세자르

0

여러 파일 이동 을 사용할 수 있습니다 . 저는이 프로젝트의 관리자입니다. 구문은 간단합니다.

mmf files*

모든 파일 이름으로 $ EDITOR를 열거 나 기본적으로 vim을 열고 vim에서 Ctrl + v + G를 사용하여 모든 파일 이름의 끝을 강조 표시하고 파일을 저장하고 종료하면 모든 파일의 이름이 바뀝니다.


-2

라이언 리

파일 확장자가없는 디렉토리 내의 여러 파일에 파일 확장자를 추가하는 올바른 구문은 다음과 같습니다.

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.