파일 이름을 바꿀 때 공백을 바꾸지 마십시오


10

다음과 같이 파일 이름을 바꾸려고합니다.

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.


리눅스에서 Mac으로 파일을 옮기고 있습니다. 그러나 어떤 이유로 Mac 시스템은 모든 파일 이름을 읽을 수 없으므로 파일 이름을 바꾸려고합니다. 위의 명령에 공백을 추가해도 작동하지 않습니다. 그리고 당신은 맞습니다 : 지정된 문자를 제외한 모든 문자를 '_'로 바꾸고 싶습니다. 그리고 나는 공백 문자를 포함시키는 방법을 모른다.

지정된 문자를 제외한 모든 문자를 '_'로 바꾸려고합니다. 이름이 바뀌는 파일에는 특별한 패턴이 없으므로이 perl 명령을 사용할 수 없습니다.

답변:


11

파일 이름을 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

공간을 추가 할 때 하이픈의 위치가 문제의 원인 일 수 있습니다. 그러나 파일 이름을 구문 분석하지 않는 충고는 유효합니다!


이 명령은 감사합니다. 또한 내가 사용한 명령에서 실수를 분명하게 식별했습니다.

2
다시 감사합니다. sed를 사용하는 경우 슬래시 '\'를 사용할 필요가 없습니다. 무시 된 문자 목록에 '\'가 추가되기 때문입니다.

2
@latach 백 슬래시이지만, 당신은 절대적으로 맞습니다. 테스트하고 파고 난 후에 .문자 클래스에서 문자 그대로 발견되었습니다 . 틸!
Zanna

2

쉘을 사용할 수도 있습니다 .Bash의 매개 변수 확장 은 대체를 수행 할 수 있습니다.

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

이중 슬래시는 구문 이외의 모든 일치 항목을 대체하도록 지시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.