globstar를 사용할 수 있습니다.
으로 globstar
쉘 옵션이 활성화, 당신이 필요로하는 모든입니다 gzip -vk **/*.{css,html}
.
Bash 셸에는 globstar
을 사용 하여 재귀 글로브 를 작성할 수 있는 옵션이 있습니다 **
. shopt -s globstar
가능하게합니다. 그러나 나중에 실행하는 다른 명령의 경우이를 수행하지 않으려 gzip
는 경우 대신 서브 쉘 에서 명령 과 명령을 실행할 수 있습니다 .
이 명령은 gzip
모든이야 .css
와 .html
모든 하위 디렉토리의 현재 디렉토리에있는 파일을, 모든 그들의 등 하위 디렉토리 (원본 파일을 유지 -k
)하고 (무엇을하고 있는지 알려주 -v
) :
(shopt -s globstar; gzip -vk **/*.{css,html})
대소 문자를 구분하지 않고 파일 이름을 일치 시키려면 대문자 또는 일부 문자가 포함 된 확장명이 포함되도록 nocaseglob
쉘 옵션을 활성화 할 수도 있습니다.
(shopt -s globstar nocaseglob; gzip -vk **/*.{css,html})
;
두 명령을 분리하면 외부 명령 (
)
이 하위 쉘에서 실행됩니다. 서브 쉘에서 쉘 옵션을 설정해도 호출 쉘에서 쉘 옵션이 설정되지 않습니다. 당신 이 활성화하고 싶다면 globstar
당신은 실행할 수 있습니다 shopt -s globstar
; 그런 다음 명령을 실행할 수 있습니다.
gzip -vk **/*.{css,html}
당신은 비활성화 할 수 있습니다 globstar
로 shopt -u globstar
. 현재 사용하도록 설정되어 있는지 확인할 수 있습니다 shopt globstar
.
작동 원리
이 gzip
명령의 작동 방식의 핵심 은 쉘이 확장을 수행하여 디렉토리 계층에서 일치하는 이름으로 각 파일 목록을 생성 한 다음 각 파일 이름을 인수로 전달하는 것 gzip
입니다.
- 가새 확장 이
**/*.{css,html}
로 바뀝니다 **/*.css **/*.html
.
- 다음 글 로빙 (현재 디렉토리에 액세스 파일의 이름으로 확장에게 그 두 가지 패턴
**
으로 인해, globstar
그 파일 이름이 무엇이든 (구성) *
) 지정된 접미사 (뒤에 .css
또는 .html
이 경우).
이름이 시작.
하거나이 방법으로 명명 된 디렉토리에있는 파일과 일치하지 않습니다 . 아마도 그러한 HTML 및 CSS 파일이 없을 것이므로 포함하고 싶지 않을 것입니다. 그러나 포함하고 싶다면 필요에 따라 명시 적으로 일치시킬 수 있습니다. 예를 들어, 여전히 폴더에서 검색 하지 않고 시작하는 파일 **/*.{css,html}
을 **/{,.}*.{css,html}
포함 하도록 변경 합니다 ..
이름이 시작하는 파일과 이름이 시작 .
되는 디렉토리에있는 파일 .
을 모두 포함하려면보다 깔끔하고 간단한 방법이 dotglob
있습니다. 쉘 옵션을 활성화하십시오 .
(shopt -s globstar dotglob; gzip -vk **/*.{css,html})
또는 당신은 대소 문자를 구분하지 일치하려는 경우 와 로 시작하는 파일 이름의 일치를 .
:
(shopt -s globstar nocaseglob dotglob; gzip -vk **/*.{css,html})
아주 드물기는하지만 **
너무 길게 확장 될 수 있습니다.
당신이있는 경우 거대한 이런 식으로 이름이 지정된 파일의 수를, 다음이 너무 긴 것 때문에 쉘이 명령 줄을 구축 할 수 없음을 설명하는 오류 메시지와 함께 실패 할 수 있습니다. (심지어 수천 개의 파일로, 이것은 보통 문제가되지 않습니다.)
gzip
전혀 부름을받지 않기 때문에 절반의 일을 할 수 없습니다.
이 오류가 발생하면 당신이 그것에 대해 걱정하는 경우, 또는, 당신은 사용할 수 있습니다 find
로 -exec
, 하나 같이 steeldriver 설명 (과 {} \;
) 또는 나는 (함께 아래 설명 {} +
).
작업과 find
함께 사용 하고 효율성을 높일 수 있습니다.-exec
+
이 gzip
명령은 압축 할 여러 파일의 이름을 제공합니다. 그러나이 find
명령은 잘 작동하지만 파일 이 많지 않으면 속도가 느리지 않지만 각 파일 마다gzip
한 번씩 명령을 실행 합니다.
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} \;
이것은 작동하며 확실히 사용할 수 있습니다. ( .
현재 디렉토리에서 검색합니다. 그 외에도, 스틸 드라이버의 훌륭한 답변으로 명령을 작성하는 방법이 약간 다릅니다 . 원하는 스타일을 사용할 수 있습니다.)
또한 find
여러 파일 이름을 전달 gzip
하고 필요한 횟수만큼만 실행할 수 있습니다 ( 거의 항상 한 번). 그렇게하려면 대신을 사용하십시오+
\;
. +
인수는 바로 뒤에 와야한다 {}
. 추가 파일 이름 (있는 경우)으로 find
바꿉니다 +
.
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
+
일치하는 파일이 적은 경우에도 사용하는 것이 좋으며 많은 gzip
파일이있는 경우 각 파일에 대해 별도의 호출을 하는 것보다 훨씬 빠릅니다 .
steeldriver가 언급 했듯이 이름이 같 거나 대소 문자가 다른 파일을 일치시키는 -iname
대신 사용할 수 있습니다 . 이것은 위에서 설명한 기반 방법 에서 활성화하는 것에 해당합니다 .-name
.css
.html
nocaseglob
globstar
마지막으로로 시작하는 일치하는 파일이나 디렉토리가 없을 것입니다 .
. 그러나 그렇게하면 find
자동으로 포함시킵니다. 당신이 원하는 경우 제외 합니다 (로 어떻게 그들을 globstar
때보다 자세히 기반 방법 dotglob
꺼짐), 당신은 할 수 있습니다 :
find . -not -path '*/.*' \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
globstar
기반 방법은 위에서 설명한 당신이 시작을 제외한 디렉토리와 파일을있어 특히, 쓰기에 간단 .
그 기본이기 때문에.
무엇을 하지 해야 할 일 ...
파일 이름은 경로 구분 기호 /
와 널 문자를 제외한 모든 문자를 포함 할 수 있습니다 . 이상한 파일 이름을 사용하는 많은 기술이 있으며 일반적으로 항상 작동하는 기술보다 더 복잡 합니다. 따라서 특정 상황에서 괜찮다는 것을 알고 (또는 알고 있다고 생각할 때) 피하는 것이 좋습니다. 물론 공백을 포함하여 특수하게 취급 될 수있는 문자가 포함 된 파일 이름이있을 경우이를 사용 해서는 안됩니다.
줄 바꿈 대신 경로 사이에 널 (null) 문자를 배치하도록하는 다른 조치 또는 유사한 조치를 사용find
하는 경우-print0
이를 처리하는 다른 명령으로 출력을 안전하게 파이프하는 것이 가능합니다 . 파일 이름에는 줄 바꿈이 포함될 수 있습니다 (심지어 파일 이름을 의도적으로 지정하는 것을 권장하지는 않습니다). find
와 명령 -print
조치 - 명시적인 행동으로 찾기 명령을 포함하여, 이후 다음은 -print
기본입니다 - 안전하게 다른 명령에 제공 그렇지 않으면 파이프 나 할 수 출력을 생성하지 않는 수행 파일에 대한 작업.
액션 find
과 함께 생성 된 출력 은 -print0
안전하게 파이프로 연결될 수 있습니다 xargs -0
( -0
플래그는 xargs
널로 분리 된 입력을 예상 함).
-r
설계된대로 작동합니다. 에서 남자 GZIP : 디렉토리 구조 반복적으로 여행. 명령 행에 지정된 파일 이름이 directory 인 경우 gzip 은 디렉토리 로 내려 가서 찾은 모든 파일을 압축합니다 (또는 gunzip의 경우 압축 해제). (강조 광산)