잘못된 문자를 사용하는 폴더/파일로 가득 찬 거대한 파일 시스템이 있습니다.
내가 원하는 것을 거의 수행하는 명령을 찾았습니다. 이 스레드에서 나온 것입니다.https://stackoverflow.com/questions/40712263/how-to-remove-special-characters-in-file-names
문제의 명령은 다음과 같습니다.
for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done &
이렇게 하면 영숫자가 아닌 모든 문자, 하이픈, 밑줄 및 밑줄이 그어진 마침표가 제거됩니다.
이 명령에서 공백을 밑줄로 바꾸는 대신 무시하도록 해야 합니다.
나는 이와 같은 변형을 시도했습니다.
for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._- ]/_/g'); done &
[] 안에 공백을 추가했지만, 물론 일이 그렇게 단순하지는 않습니다.
기본적으로 파일/폴더에서 영숫자, 하이픈, 밑줄, 공백 또는 마침표/마침표를 사용하지 않는 한 다른 모든 문자를 밑줄로 대체하고 싶습니다.
공백과 다른 문자를 무시하도록 위 명령을 어떻게 수정할 수 있습니까? 아니면 이를 수행하는 더 좋은 방법이 있습니까? 불행히도 이 서버에서는 이름 바꾸기 명령이 작동하지 않아 내가 찾은 다른 솔루션 중 일부가 제한됩니다.
답변1
사용 find
및진주의rename
:
find . -depth -exec rename -n 's/[^\w .-]/_/g' {} +
-n
출력에 만족하면 제거합니다.
이것은재귀적, 그리고:
LESS='+/^ +-depth' man find
-depth
각 디렉터리의 내용은 디렉터리 자체를 처리하기 전에 처리됩니다.
답변2
문자 클래스 -
의 표현문자 범위. 글을 쓰면 " 로 시작하고 끝나는 모든 문자와 .-
일치합니다 . 이는 전혀 문자가 아닙니다..
앞으로
.
.
리터럴 문자와 일치하려면 -
필요한
- 탈출하려면:
\-
, - 캐릭터 클래스의 첫 번째에 넣거나
- 캐릭터 클래스의 마지막에 넣으세요.
그래서,
for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._ -]/_/g'); done &
당신이 원하는 것을해야합니다.