zsh를 사용할 때 정규식을 명령에 전달

zsh를 사용할 때 정규식을 명령에 전달

Bash에서는 다음을 수행할 수 있습니다.

apt install blabla*

하지만 zsh에서는

zsh: no matches found: blabla*

현재 디렉토리에 blablabla라는 파일이 없다면 말이죠.

파일을 삭제할 때 문제가 발생할 수도 있습니다.이내에폴더에 쓰기 위해 sudo 액세스가 필요한 경우 폴더 자체를 삭제할 필요가 없습니다.

zsh가 정규식을 명령에 전달하도록 하려면 어떻게 해야 합니까?

답변1

파일 이름 와일드카드 패턴은 정규식이 아닙니다. 그들은비슷한그러나 와일드카드 패턴은 blabla*string 으로 시작하는 이름과 일치하는 blabla반면, 정규 표현식은 blabla*하위 문자열 blabl(아마도 0개 이상의 a문자가 뒤따를 수 있음)을 포함하는 문자열과 일치합니다.

문자열을 다음과 같이 사용하지 않고 셸에 blabla*인수로 전달합니다.apt install파일 이름 와일드카드 패턴, 이를 인용하면 다음과 같습니다.

apt install 'blabla*'

기본적으로 셸에는 다음 과 같은 셸 옵션 세트가 zsh있습니다 .NOMATCHfailglobbash아니요이 셸에서는 기본적으로 설정됩니다). 이로 인해 와일드카드 패턴이 일치하는 항목이 없을 때 진단 메시지와 함께 셸이 실패하게 됩니다. 물론 이 셸 옵션을 끌 수도 있지만( 또는 사용 ), unsetopt NOMATCH액세스할 수 없는 파일을 삭제 setopt NO_NOMATCH하는 경우에는 도움이 되지 않습니다 .sudo

이와 같은 파일 이름 패턴을 확장하려면 bla/*쉘이 필요합니다( rm명령 자체는 쉘 글로빙 패턴을 확장할 수 없으며 명령이 거의 없기 때문에 sudo rm -rf bla/*현재 쉘이 패턴을 참조하여 확장하려고 시도하는 것을 방지하더라도 작동하지 않습니다). . 디렉토리의 이름을 읽을 수 있는 권한이 없을 수 있으므로 bla쉘은 다음 사용자로 실행되어야 합니다:하다루트와 같은 디렉터리의 이름을 읽을 수 있는 권한이 있습니다. 루트 사용자로 쉘을 실행할 수 있습니다 sudo.

액세스 권한이 없는 디렉터리의 모든 파일과 디렉터리를 삭제하려면 다음을 사용하세요 sudo.

sudo sh -c 'rm -rf directoryname/*'

이렇게 해도 숨겨진 이름은 제거되지 않습니다. 이렇게 하려면 다음과 같은 방법을 사용하세요.

sudo bash -O dotglob -c 'rm -rf directoryname/*'

또는

sudo zsh -c 'rm -rf directoryname/*(D)'

또는

sudo find directoryname -mindepth 1 -delete

또는 표준을 사용 find하여

sudo find directoryname -depth ! -path directoryname -exec rm -rf {} +

처음 세 명령은 루트 사용자가 실행 하거나 sh -c셸 에서 실행할 때 globbing에 의존하는 반면, 마지막 두 명령은 파일 이름 globbing을 전혀 사용하지 않습니다. 의 변형은 수천 개의 파일이 포함된 디렉터리 삭제도 지원합니다(글로빙을 시도하면 "매개변수 목록이 너무 깁니다" 오류가 발생할 수 있음).bash -czsh -cfind

정말로 삭제하고 싶다면 다른 옵션이 있습니다모두디렉토리의 내용은 전체 디렉토리를 삭제하면 됩니다.

sudo rm -rf directoryname

그런 다음 올바른 소유권과 권한으로 다시 생성하세요.

관련 정보