폴더 이름에서 문자를 찾거나 바꾸는 방법은 무엇입니까?

폴더 이름에서 문자를 찾거나 바꾸는 방법은 무엇입니까?

나는 다음을 수행하고 싶습니다 :

  • 모든 항목을 찾아서 바꾸고(정규식 사용) <>:"\|?빈 문자열로 바꿉니다.
  • 모든 항목을 찾아서 바꾸고(정규식 사용) ^\.+|\.+$빈 문자열로 바꿉니다.

테스트로 2개의 폴더를 수동으로 생성하고(스크린샷 참조) 다음을 실행했습니다.

find "/home/users/Downloads/test" -regextype sed -regex "*<>:\|?*" -type d
find "/Users/chiyo/Downloads/test" -regextype sed -regex "*[<>:\|?]*" -type d
find "/Users/chiyo/Downloads/test" -regextype sed -regex "[<>:\|?]" -type d

아무것도 찾지 못했습니다.

나는 이 버전을 사용하고 있습니다 find.

=> find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.

이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

디렉토리를 보여주는 스크린샷

답변1

처음 두 예제는 오래되었습니다.

  • *<>:\|?*0개 이상의 이전 원자를 나타내기 위해 . 를 사용할 수 없습니다 *. *또한 ...가 뒤따른다는 의미도 있으며 특수 <문자 입니다. >:?
  • *[<>:\|?]*이는 사용한 문자 클래스에 더 가깝지만 아직 *시작 단계입니다.
  • [<>:\|?]하위 정규식 일치라면 일치하지만 그렇지 않습니다. 디렉터리 경로를 포함하여 전체 파일 이름이 일치해야 합니다.

따라서 정규식 코드를 추가하여 이전과 이후에 오는 내용을 사용하세요. ( 이전 원자를 0개 이상 보장하는 .문자입니다 . 따라서 무엇이든 일치합니다.)*.*

그러니 시도해 보세요.*[<>:\|?].*

당신은 이런 것을 대체하지 않으며, 무엇으로 대체하고 싶은지도 말하지 않습니다.

답변2

-name대신 사용하십시오 -regex(실제로 관심 있는 파일 이름이고 -regex전체 경로와 일치하므로).

find folder -type d -name '*[<>:\|?]*'

이름 아래에 , , 또는 문자 중 하나 이상 folder이 포함된 모든 디렉토리를 찾습니다 .<>:\|?

디렉터리 이름에서 이러한 문자를 제거하려면 다음을 수행하십시오.

find folder -depth -type d -name '*[<>:\|?]*' \
    -execdir bash -c 'mv "$1" "${1//[<>:\|?]/}"' bash {} ';'

이는 이름이 바뀐 디렉터리의 새 이름이 기존 디렉터리의 이름이 아니라고 가정합니다. 이름 충돌 테스트 추가:

find folder -depth -type d -name '*[<>:\|?]*' \
    -execdir bash -c '[ ! -e "${1//[<>:\|?]/}" ] && mv "$1" "${1//[<>:\|?]/}"' bash {} ';'

이렇게 하면 새 이름이 이미 존재하는 경우 디렉터리 이름을 바꾸려고 하지 않습니다.

mv명령은 서브쉘에서 실행됩니다 bash. 쉘은 발견된 디렉토리의 상위 디렉토리를 작업 디렉토리로 사용하여 실행됩니다. 특정 매개변수 대체를 사용하여 bash발견된 디렉터리의 파일 이름에서 문제가 있는 모든 문자를 제거합니다.

-depth이 명령은 .txt 아래의 디렉터리 구조에 대한 깊이 우선 탐색을 수행하는 데에도 사용됩니다 folder. 이것이 없으면 find방금 이름을 바꾼 디렉토리에 들어가려는 시도가 이루어지며 실패합니다.

관련된:

관련 정보