닫는 괄호 ')'를 포함하지 않는 디렉토리 찾기

닫는 괄호 ')'를 포함하지 않는 디렉토리 찾기

연도로 끝나지 않는 모든 비디오 디렉토리(파일 아님)를 나열하려고 합니다. 예를 들어 (2015)더 구체적으로 말하면 연도가 나열되지 않으므로 닫는 괄호로 끝나지 않습니다 ).

다음과 반대로 하려면 어떻게 해야 합니까?

# 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 -- *[^\)]

(경로 이름 확장(와일드카드/전역) 패턴 사용 : […], 또는 ; , 또는 를 제외한 모든 항목과 일치합니다 . 따라서 을 제외한 모든 항목과 일치합니다 .)[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/.

관련 정보