파일 확장자를 에서 으로 변경하고 *.txt
싶습니다 *.text
.basename
명령을 실행했지만 여러 파일을 변경하는 데 문제가 있습니다.
이것은 내 코드입니다.
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
다음 오류가 발생합니다.
basename: 인수가 너무 많습니다. 자세한 내용을 보려면 basename --help'를 시도해 보세요.
답변1
직접적으로그렉의 위키:
# Rename all *.txt to *.text
for file in *.txt; do
mv -- "$file" "${file%.txt}.text"
done
*.txt
예와일드카드 패턴, *
임의의 문자열과 일치시키기 위해 와일드카드로 사용됩니다. *.txt
".txt"로 끝나는 모든 파일 이름과 일치합니다.
--
옵션 목록의 끝을 표시. 이렇게 하면 하이픈으로 시작하는 파일 이름과 관련된 문제를 방지할 수 있습니다.
${file%.txt}
예매개변수 확장, 끝에서 제거된 변수 값으로 대체됩니다 file
..txt
이유에 대한 항목도 참조하세요.파싱하면 안 된다ls
.
을 사용해야 하는 경우 basename
구문은 다음과 같습니다.
for file in *.txt; do
mv -- "$file" "$(basename -- "$file" .txt).text"
done
답변2
현재 디렉토리에 있는 모든 파일의 확장자를 변경하는 방법은 다음과 같습니다.데비안 또는 우분투.
rename "s/oldExtension$/newExtension/" *.txt
(이것은 Perl rename
명령이지 저 util-linux
명령이 아닙니다.Debian/Ubuntu의 이름 바꾸기 유틸리티가 CentOS와 같은 다른 배포판의 이름 바꾸기 유틸리티와 다른 이유는 무엇입니까?)
MacOS에서는 사용자가수도사 피트보고서는 그들이 brew install rename
이 목표를 달성하기 위해 이를 활용할 수 있었다고 말합니다.
답변3
간단한 명령,rename
~에서util-linux
, 당신을 위해 이것을 해줄 것입니다. "*.txt"와 일치하는 모든 파일에서 "txt"를 모두 "text"로 바꿉니다.
rename txt text *.txt
답변4
여기에 인용된 답변은 s/oldExtension/newExtension/
잘못되었습니다. 을 사용하면 원하는 대로 s/txt/text/
변환되지 footxt.txt
않습니다 . footext.txt
를 사용해도 로 s/.txt/.text/
변환됩니다 .footxt.txt
fo.text.txt
마침표를 일치시키려면 을 사용해야 합니다 \.
( .
모든 문자와 일치함). 후행은 $
줄의 끝과 일치합니다. 그래야만 확장자가 올바르게 일치할 수 있습니다.
rename 's/\.txt$/.text/' *.txt
rename 's/\.old$/.new/' *.old