문제

디렉토리에는 많은 사람들이 있습니다 *.html 파일. 나는 그것들을 모두 이름을 바꾸고 싶습니다 *.txt

어떻게 할 수 있습니까? 나는 배쉬 쉘을 사용합니다.

도움이 되었습니까?

해결책

더 나은 솔루션은 외부 통화와 달리 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

당신이 원하는 것을 정확하게합니다.

이것은 .txt에서 .txt_bak까지 OSX에서 나를 위해 일했습니다.

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 명령입니다. Linux에서 무언가가 필요하다면 이것이 잘 작동합니다. 더 많은 크로스 플랫폼이 필요한 경우 다른 답변 중 하나를 살펴보십시오.

Mac에서 ...

  1. 설치 이름 바꾸기 그렇지 않은 경우 : brew install rename
  2. rename -S .html .txt *.html

우분투 사용자의 경우 :

rename 's/\.html$/\.txt/' *.html

다음은 이름 변경 명령의 예입니다.

rename -n ’s/\.htm$/\.html/’ *.htm

-N은 테스트 실행이며 실제로 파일을 변경하지 않음을 의미합니다. -n을 제거하면 이름이 바뀌는 파일 목록이 표시됩니다. 위의 경우 현재 디렉토리의 모든 파일을 파일 확장에서 .htm의 .html로 변환합니다.

위의 테스트 실행의 출력이 괜찮아 보인 경우 최종 버전을 실행할 수 있습니다.

rename -v ’s/\.htm$/\.html/’ *.htm

-V는 선택 사항이지만 아래 샘플 출력에 표시된대로 이름 변경 명령에 의해 변경된 유일한 레코드이기 때문에 포함하는 것이 좋습니다.

$ 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}" - 언제 찾기 파일 이름으로 {}를 전달하면 $ {filename%.*}는 확장자없이 기준을 추출하여 매개 변수를 형성합니다. MV. 세게 때리다 {txt, html}을 가져와 두 매개 변수로 다시 작성하여 최종 명령이 다음과 같이 실행됩니다. mv -iv "filename.txt" "filename.html"

그러나 필요한 수정 : 파일 이름의 공간 처리

이 질문은 Bash를 명시 적으로 언급하지만 ZSH를 사용할 수있게되면 매우 간단합니다.

zmv '(*).*' '$1.txt'

당신이 얻는다면 zsh: command not found: zmv 그런 다음 간단히 실행하십시오.

autoload -U zmv

그런 다음 다시 시도하십시오.

감사합니다 원본 기사 ZMV에 대한 팁.

이것은 OSX와 Linux에서 작동하는 가장 매끄러운 솔루션이며 GIT 와도 잘 작동합니다!

find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

그리고 git :

find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;

그만큼 명령 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' - {}

Perl을 선호하는 경우 여기에서 원하는 것을 정확하게 수행하는 짧은 Perl 스크립트 (Perl의 제작자 인 Larry Wall이 orignally 작성)가 있습니다.tips.webdesign10.com/files/rename.pl.txt. 예를 들어 다음은 트릭을 수행해야합니다

rename.pl 's/html/txt/' *.html

= )

(업데이트 된 URL에 대한 @loretoparisi 감사합니다)

불행히도 휴대 할 수있는 것은 사소한 일이 아닙니다. 당신은 아마 약간의 Expr 마술이 필요할 것입니다.

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

행복한 일이라면 에코를 제거하십시오.

편집하다: basename 아마도이 특별한 경우에 대해 조금 더 읽기 쉬울 것입니다. expr 일반적으로 더 유연합니다.

이것은 한 번에 여러 확장을 수정하는 좋은 방법입니다.

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

참고 : 확장 크기가 동일하게 조심하십시오 (???).

멋지고 간단합니다!

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$ 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top