여러 파일의 확장자를 어떻게 바꾸나요?
디렉토리에는 많은 *.html
파일 이 있습니다. 모두 이름을 바꾸고 싶습니다*.txt
어떻게해야합니까? 나는 bash 쉘을 사용한다.
더 나은 솔루션 (외부 호출이 아닌 bash 기능 만있는) 은 다른 답변 중 하나를 참조하십시오 .
다음은 시스템에 rename
프로그램 이 있어야 할 필요가 없으며 시스템에서 가장 자주 프로그램 을 갖 더라도 필요합니다 .
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
편집 : 주석에서 지적했듯이 올바른 인용 부호가없는 파일 이름에는 공백이 없습니다 (이제 위에서 추가). 파일 이름에 공백이 없다는 것을 알고있는 파일에서 순수하게 작업 할 때 이것이 작동하지만 나중에 재사용 할 수있는 것을 쓸 때마다 적절한 인용을 건너 뛰지 마십시오.
bash를 사용하는 경우 sed, basename, rename, expr 등과 같은 외부 명령이 필요하지 않습니다.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html
정확히 당신이 원하는 것을합니다.
이것은 OSX에서 .txt에서 .txt_bak까지 나를 위해 일했습니다.
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
사용하고 싶습니다 rename
:
rename -S .html .txt *.html
이것은 원하는 것을 정확히 수행합니다- 일치하는 모든 파일 의 확장자를에서 .html
로 변경합니다 ..txt
*.html
참고 : Greg Hewgill은 이것이 bash 내장이 아니라고 정확하게 지적합니다. 별도의 Linux 명령입니다. 만약 당신이 리눅스에서 무언가를 원한다면 이것은 잘 동작 할 것이다; 더 많은 크로스 플랫폼이 필요한 경우 다른 답변 중 하나를 살펴보십시오.
Mac에서 ...
- 다음 을 수행하지 않은 경우 이름 바꾸기를 설치하십시오 .
brew install rename
rename -S .html .txt *.html
우분투 사용자의 경우 :
rename 's/\.html$/\.txt/' *.html
이것은 내가 찾은 가장 매끄러운 솔루션으로 OSX 및 Linux에서 작동하며 git에서도 잘 작동합니다!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
그리고 자식으로 :
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
다음은 rename 명령의 예입니다.
rename -n ’s/\.htm$/\.html/’ *.htm
-n은 테스트 실행이며 실제로 파일을 변경하지 않음을 의미합니다. -n을 제거하면 이름이 바뀔 파일 목록이 표시됩니다. 위의 경우 현재 디렉토리의 모든 파일을 파일 확장자가 .htm에서 .html로 변환합니다.
위의 테스트 실행 결과가 정상으로 보이면 최종 버전을 실행할 수 있습니다.
rename -v ’s/\.htm$/\.html/’ *.htm
-v는 선택 사항이지만 아래 샘플 출력에 표시된 것처럼 rename 명령으로 변경 한 유일한 레코드이므로 포함시키는 것이 좋습니다.
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
중간에 까다로운 부분은 아래에 강조 표시된 정규식을 사용한 Perl 대체입니다.
rename -v ’s/\.htm$/\.html/’ *.htm
다른 사람의 웹 사이트가 크롤링 된 후, 광범위한 하위 디렉토리에 걸쳐 .html 확장자가없는 수천 개의 파일이 생겼습니다.
이미 .html 확장자를 가진 파일을 제외하고 한 번에 모두 이름을 바꾸려면 (대부분은 전혀 없었습니다), 이것은 나를 위해 일했습니다.
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
OP의 경우 * .txt 파일의 이름 만 바꾸려면 약간 수정하면됩니다.
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
세분화 (해머 타임!) :
-iname * .txt-
이미 .txt로 끝나는 파일 만 고려함
mv -iv "{}. {txt, html}"- find 가 {}을 파일 이름으로 {}를 전달하면 $ {filename %. *}은 확장자없이 기본 이름을 추출하여 매개 변수를 mv로 구성 합니다. bash 는 {txt, html}을 사용하여 두 개의 매개 변수로 다시 작성하므로 최종 명령은 다음과 같이 실행됩니다.mv -iv "filename.txt" "filename.html"
그래도 필요한 수정 : 파일 이름에서 공백 처리
이 질문에는 Bash가 명시 적으로 언급되어 있지만 ZSH를 사용할 수 있으면 매우 간단합니다.
zmv '(*).*' '$1.txt'
당신이 얻는 zsh: command not found: zmv
다면 간단하게 실행하십시오 :
autoload -U zmv
그런 다음 다시 시도하십시오.
zmv에 대한 팁에 대한 이 원본 기사 덕분에 .
이 명령mmv
은 엄청난 수의 파일 (초당 수만)에서이 작업을 매우 효율적으로 수행하는 것 같습니다. 예를 들어, 모든 .xml
파일의 이름 을 .html
파일 로 바꾸려면 다음을 사용하십시오.
mmv ";*.xml" "#1#2.html"
(가) ;
경로와 일치 것이라고는 *
파일 이름과 일치합니다, 이들은라고도 #1
하고 #2
대체 이름.
기반 exec
또는 파이프 에 대한 응답 이 너무 많은 파일에서 너무 느리거나 실패했습니다.
이 시도
rename .html .txt *.html
용법:
rename [find] [replace_with] [criteria]
파티에 조금 늦었 어 xargs로 할 수 있습니다 :
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
또는 모든 파일이 일부 폴더에있는 경우
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
여러 확장을 한 번에 수정하는 좋은 방법입니다.
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
참고 : 확장 크기가 같아 지도록주의하십시오 (???).
: 당신이 PERL을 선호하는 경우, 정확하게 당신이 여기에 원하는 것을 할 것입니다 (orignally 래리 벽, PERL의 창조자에 의해 작성) 짧은 PERL 스크립트가 tips.webdesign10.com/files/rename.pl.txt은 . 귀하의 예를 들어 다음은 트릭을 수행해야합니다.
rename.pl 's/html/txt/' *.html
=)
(@loretoparisi에게 업데이트 된 URL을 주셔서 감사합니다)
불행히도 휴대하기 쉬운 것은 아닙니다. 아마도 약간의 expr 마술이 필요할 것입니다.
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
원하는대로 수행하면 반향을 제거하십시오.
편집 : basename
이 경우에는 좀 더 읽기 쉽지만 expr
일반적으로 더 유연합니다.
좋고 간단합니다!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;
여기에 .edge
파일 이름을 바꾸는 데 사용한 것이 있습니다..blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
매력처럼 작동합니다.
한 줄, 루프 없음 : ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$
Bash에서 기능을 만들어 추가 .bashrc
하거나 원하는 위치에 추가 할 수도 있습니다 .
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
용법:
change-ext css scss
함수의 코드 소스 : https://stackoverflow.com/a/1224786/6732111
참고 URL : https://stackoverflow.com/questions/1224766/how-do-i-rename-the-extension-for-a-bunch-of-files
'Programing' 카테고리의 다른 글
루비에 "do… while"루프가 있습니까? (0) | 2020.02.17 |
---|---|
유형에 대해 JSON.NET 오류 자체 참조 루프가 발견되었습니다. (0) | 2020.02.17 |
'new'연산자와 함께 .apply () 사용. (0) | 2020.02.17 |
Git에서 HEAD, 작업 트리 및 인덱스의 차이점은 무엇입니까? (0) | 2020.02.17 |
서버에 요청을 보낼 때 curl에 의해 작성된 요청 헤더를 어떻게 볼 수 있습니까? (0) | 2020.02.17 |