다음과 같이 파일 이름을 바꾸려고합니다.
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
그러나이 sed
명령은 모든 공백을로 바꿉니다 _
.
sed
지정된 문자와 함께 공백을 포함하도록 명령을 편집하는 방법은 무엇입니까? 사용하려고 \s
했지만 작동하지 않습니다 …
편집 :
예를 들어 파일의 trip: hill
이름을 바꿔야 trip_ hill
하지만 위의 명령으로 파일을 만듭니다 trip__hill
.
답변
파일 이름을 sed
!으로 구문 분석하지 마십시오 . 의 출력 echo "$file"
이 신뢰할 수 없습니다.
사용하십시오 rename
. 17.10에서는 먼저 설치해야합니다.
sudo apt install rename
그때:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
메모
-n
실제로 파일 이름을 바꾸는 테스트 후 제거--
파일이 다음으로 시작하는 경우 옵션 종료-
[^-A-Za-z0-9_ .]
우리가 바꾸고 싶지 않은 문자--
먼저 또는 마지막에 넣어서 범위를 표시 할 수 없도록하십시오 (문자 그대로이 위치에서 처리됩니다).- 수업에 공백이 포함될 수 있습니다
.
문자 그대로 취급됩니다 (다른 정규식 컨텍스트에서는 모든 문자를 나타내며 탈출해야합니다).
이것은 또한 작동합니다 sed
:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
버전 끝에 공백을 추가하면 오류가 발생합니다.
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
그러나 -
결국에는 작동합니다.
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
공간을 추가 할 때 하이픈의 위치가 문제의 원인 일 수 있습니다. 그러나 파일 이름을 구문 분석하지 않는 충고는 유효합니다!
답변
쉘을 사용할 수도 있습니다 .Bash의 매개 변수 확장 은 대체를 수행 할 수 있습니다.
for f in ./* ; do
mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done
이중 슬래시는 구문 이외의 모든 일치 항목을 대체하도록 지시합니다.