bash -c로 시작하는 단일 명령줄을 사용하여 전체 디렉터리 수를 어떻게 계산할 수 있나요?
접두사가 붙은 파일을 제외한 모든 파일이 반환됩니다.
bash -c "stat /path/todir/**"
그러면 모든 .include가 반환됩니다. & ..는 제외되어야 합니다.
bash -c "stat /path/todir/.*"
이것은 작동하지만 bash -c에서는 작동하지 않으며 두 줄이 필요합니다
shopt -s dotglob
stat /path/todir/**
이것도
stat /path/todir/!(.|..)
답변1
확장된 glob 옵션은 현재 셸에만 표시됩니다.아니요실행된 서브쉘에. 또한 glob 옵션을 사용할 수 있도록 하려면 하위 쉘에서 이를 설정해야 합니다. 재귀 하강은 다른 확장 옵션이 설정된 경우에만 **
발생합니다 globstar
. 현재 디렉토리 요구 사항의 경우 간단히 다음을 사용할 수 있습니다.*
bash -c 'shopt -s dotglob; stat /path/todir/*'
전체 쉘 명령 목록에서 작은따옴표를 사용한다는 점에 유의하세요. 더 안전합니다. 불필요한 변수 확장(리터럴 문자열 전달)을 방지하고 인용 문자열을 쉽게 사용할 수 있습니다.
외부 부분을 제어할 수 있는 경우 '..'
호출 자체에서 확장 셸 옵션을 다음과 같이 설정할 수 있습니다.
bash -O dotglob -c 'stat /path/todir/*'
즉, find
외부 유틸리티와 같은 것을 사용할 수 있는 옵션이 있는 경우 다음을 수행하고 .
(현재 디렉터리 이름)을 제외하고 현재 디렉터리의 모든 파일을 포함하고 stat
한 번에 전달할 수 있습니다.
find . ! -path . -exec stat {} +
답변2
bash -c -O extglob 'stat /path/todir/!(.|..)'
-O extglob
!(pattern-list)
부정 연산자를 포함한 추가 패턴 일치 연산자를 활성화합니다 .
[-+]O [shopt_option]
shopt_option is one of the shell options accepted by the shopt builtin (see
SHELL BUILTIN COMMANDS below). If shopt_option is present, -O sets the
value of that option; +O unsets it.
If the extglob shell option is enabled using the shopt builtin, several extended pattern matching
operators are recognized. In the following description, a pattern-list is a list of one or more
patterns separated by a |. Composite patterns may be formed using one or more of the following
sub-patterns:
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns