나는 다음을 수행하고 싶습니다 :
- 모든 항목을 찾아서 바꾸고(정규식 사용)
<>:"\|?
빈 문자열로 바꿉니다. - 모든 항목을 찾아서 바꾸고(정규식 사용)
^\.+|\.+$
빈 문자열로 바꿉니다.
테스트로 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
방금 이름을 바꾼 디렉토리에 들어가려는 시도가 이루어지며 실패합니다.
관련된: