끝 괄호 ')'를 제외하고 디렉토리 찾기

끝 괄호 ')'를 제외하고 디렉토리 찾기

저는 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]합니다 . , , 또는 을 제외한 모든 것과 일치합니다 . 따라서 를 제외한 모든 것과 일치합니다 .)abc[^abc]abc[^\)])

방법 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/.

관련 정보