재귀 Linux 파일 시스템에서 유효하지 않은 문자 제거

재귀 Linux 파일 시스템에서 유효하지 않은 문자 제거

잘못된 문자를 사용하는 폴더/파일로 가득 찬 거대한 파일 시스템이 있습니다.

내가 원하는 것을 거의 수행하는 명령을 찾았습니다. 이 스레드에서 나온 것입니다.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 &

당신이 원하는 것을해야합니다.

관련 정보