![끝 괄호 ')'를 제외하고 디렉토리 찾기](https://rvso.com/image/83705/%EB%81%9D%20%EA%B4%84%ED%98%B8%20')'%EB%A5%BC%20%EC%A0%9C%EC%99%B8%ED%95%98%EA%B3%A0%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%B0%BE%EA%B8%B0.png)
저는 1년으로 끝나지 않는 모든 비디오 디렉토리(파일 아님)를 나열하려고 합니다. 예를 들어 (2015)
더 구체적으로 말하면 1년이 나열되지 않아 닫는 괄호로 끝나지 않습니다 )
.
다음과 반대로 하려면 어떻게 해야 합니까?
# List all files and directories end with '(2015)'
ls -ld *\(2015\)
# List all files and directories end with ')'
ls -ld *\)
누구든지 이 작업을 수행하는 방법을 설명하는 데 도움을 줄 수 있습니까?
답변1
이 시도:
ls -ld *[^\)]
[] - 관심 있는 문자 집합
^ - 부정(원하지 않는 문자 집합을 포함함)
\) - 이스케이프된 ')'
답변2
Bash 또는 zsh에서:
for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done
이는 단순히 현재 디렉토리의 모든 파일과 디렉토리를 순환하고 i) 디렉토리인지( 그리고 ii) 이름이 ( [ -d "$i" ])
. 로 끝나지 않는지 확인합니다 . 두 테스트를 모두 통과한 항목이 인쇄됩니다.)
[[ ! "$i" =~ \)$ ]]
이는 임의의 파일 이름을 처리할 수 있습니다(ls
할 수 없는 것).
답변3
방법 1a:
ls -ld -- *[^\)]
[…]
( 경로 이름 확장(와일드카드/glob) 패턴 사용 : , , 또는 과 일치 [abc]
합니다 . , , 또는 을 제외한 모든 것과 일치합니다 . 따라서 를 제외한 모든 것과 일치합니다 .)a
b
c
[^abc]
a
b
c
[^\)]
)
방법 2a:
GLOBIGNORE="*)"
ls -ld -- *
꽤 자명한가요?
이 두 가지 방법 모두 디렉터리가 아닌 파일 및 기타 개체와 일치합니다.
디렉토리만 찾으려면 don_crissti의 제안으로 업데이트되었습니다.
방법 1b:
ls -ld -- *[^\)]/
방법 2b:
GLOBIGNORE="*)/"
ls -ld -- */
/
값 에 를 포함해야 합니다 GLOBIGNORE
.
답변4
POSIX적으로:
find . ! -name . -prune -type d ! -name '*)'
와 함께 zsh
:
print -rl -- *[^\)](/)
다른 Bourne 유사 쉘에는 글로빙 결과를 필터링하는 기능이 없습니다. 당신이 사용할 수있는:
printf '%s\n' *[!\)]/
디렉토리에만 일치합니다. 그러나 확장 결과에 후행 슬래시가 추가됩니다. 디렉토리를 사용하면 foo
얻을 수 있습니다 foo/
.