shopt -s extglob이 예상대로 작동하지 않습니다.

shopt -s extglob이 예상대로 작동하지 않습니다.

WordPress 설치에서 파일 권한을 반복적으로 변경하려고 합니다. 이는 public_html 문서 루트 폴더(특정 폴더 제외) 아래의 모든 항목에 영향을 미칩니다.

나는 extglob을 다음으로 설정했습니다.shopt -s extglob

다음 명령을 실행하면 제외하려는 폴더를 제외하지 못합니다. ls -R -alh ./public_html/!(*uploads*) | grep uploads

위의 내용은 업로드 폴더에 수많은 파일을 나열합니다. 파일이 나열되어서는 안 됩니다.

물론 위 명령은 단지 테스트일 뿐입니다. chmod실제 스크립트에서 사용하겠습니다.

예를 들어 다음과 같이 다양한 조합을 시도했지만 성공하지 못했습니다.

ls -R -alh ./public_html/!(wp-content/uploads*)

ls: ./public_html/!(wp-content/uploads*)에 액세스할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

쉘 명령에서 제외를 사용하려고 시도한 것은 이번이 처음이므로 단순한 실수를 저지르고 있을 수도 있습니다.

내가 뭘 잘못하고 있는지 어떤 아이디어가 있습니까?

참고: 질문의 목적은 extglob을 더 잘 이해하는 것이지 대안을 찾는 것이 아닙니다. 대안을 작성할 수 있지만 이전에 extglob을 사용해 본 적이 없기 때문에 구문을 이해하는 데 어려움을 겪고 있습니다.

답변1

첫째, extglob은 ls명령줄에서 보는 내용을 제어합니다. 물론아니요ls명령줄에 표시되는 내용으로 수행되는 작업을 제어합니다 . 이는 탐색 -R옵션을 알려주기 때문에 중요합니다.lsls재귀적으로명령줄에 표시되는 모든 디렉터리. 따라서 *uploads*명령줄에 디렉토리가 명시적으로 제공되지 않더라도 ls상위 디렉토리를 탐색하면 해당 디렉토리를 찾을 수 있습니다.

둘째, 아시다시피ls를 구문 분석하지 마세요. 의 출력은 ls파이프나 스크립트에서 작동하지 않습니다. 이런 식으로 사용하려고 하면 결국 불행을 초래할 것입니다.

셋째, 필요한 파일을 얻으려면 다음을 시도하십시오.

find ./public_html ! -path '*uploads*'

설명하다:

  • find에게 디렉토리에서 검색을 ./public_html시작하라고 지시합니다 ../public_html

  • 이 옵션 자체는 -path '*uploads*'패턴을 포함하는 모든 경로와 일치합니다 *uploads*. (find의 options 와 유사 -path하지만 디렉토리 이름을 포함합니다.) 그러나 앞의 것은 부정을 의미합니다. 따라서 이 옵션은 일치하는 경로를 제외합니다.-namepath!! -path '*uploads*'*uploads*

ls기능을 계속 사용하면서 스타일이 지정된 출력을 얻으려면 다음을 find고려하십시오.

find ./public_html ! -path '*uploads*' -exec ls -dalh {} +

답변2

John1024는 귀하의 명백한 문제에 대한 좋은 솔루션을 추가했지만 의견을 기반으로 extglob을 더 잘 이해하고 싶습니다. 나는 핵심 오해 중 하나가 extglob이 재귀적으로 작동할 것이라는 점, 즉 ./public_html/!(*uploads*)extglobs라는 것을 제외하는 진술일 수 있다고 생각합니다 ./public_html/wp-content/uploads/. Globs(파일 이름 확장자)는 한 번에 단일 디렉터리 수준에서만 작동합니다. bash 매뉴얼에 묻혀 있습니다.파일 이름 확장자예:

파일 이름을 일치시킬 때 슬래시 문자는 항상 명시적으로 일치해야 합니다.

따라서 John1024가 말했듯이 ls명령은 어떤 형태의 (확장) 인수도 취하지 않지만 예를 들어 하나의 인수 (제외된 패턴과 일치하지 않음)를 ./public_html/*uploads*가질 수 있으며 재귀 목록에 전달됩니다../public_html/wp-content-R

명령줄에서 extglobs를 사용하여 디렉터리를 제외 하려면 *uploads*하위 디렉터리 수만큼 제외 항목을 포함하는 명령을 구성해야 합니다.

ls -dalh ./public_html/!(*uploads*) \
         ./public_html/!(*uploads*)/!(*uploads*) \
         ./public_html/!(*uploads*)/!(*uploads*)/!(*uploads*)
# ... etc ...

...ls 플래그를 사용하지 않도록 주의하세요 -R. -Rchmod 명령에도 동일한 위험이 적용됩니다. 여기서 잠재적인 위험 중 하나는 하위 디렉터리에 "너무 많은" 파일이 있으면 위험에 처하게 된다는 것입니다.매개변수 목록 채우기을 위한 ls. 이 접근 방식은 작성한 스키마 수보다 깊게 새로 생성된 디렉터리를 포착하지 못하기 때문에 취약하며, ls디렉터리가 하나라도 있는 경우 중단됩니다(디렉토리 누락에 대해 불평함).더 적은하위 디렉터리의 수가 주어진 스키마의 수보다 많습니다. 이유에 대한 긴 설명찾다작업에 적합한 도구입니다.

관련 정보