"ls -R" 출력에서 ​​디렉터리를 제외하는 방법은 무엇입니까?

"ls -R" 출력에서 ​​디렉터리를 제외하는 방법은 무엇입니까?

만약에

ls -aR | grep ":$"

반품

./.hiddendir2:
./dir1:
./dir3:
./dir3/.hiddendir4:

그렇다면 grep에 제공된 패턴을 어떻게 업데이트하여 다음과 같은 결과만 얻을 수 있습니까?

./dir1:
./dir3:

(부모가 숨겨져 있지 않더라도 .hiddendir4를 포함하는 마지막 줄은 생략됩니다.)


다음은 몇 가지 맥락과 함께 동일한 질문의 긴 버전입니다.

에서 훌륭한 스크립트를 찾았습니다.http://www.centerkey.com/tree/디렉토리 트리를 인쇄하기 위해 작업 중이지만 작업 중인 저장소의 .git 디렉토리 하위 항목으로 인해 출력이 복잡해지는 경우가 있습니다.

소스 코드를 올바르게 읽고 있다면 다음 줄에서 grep 패턴을 변경해야 합니다.

ls -aR | grep ":$"

^\./(?!\.)\w+:$지금까지 테스트에서 작동하는 것처럼 보이는 것을 생각해 냈습니다.http://regexpal.com/, 하지만 bash에서 실행하려고 하면 충돌이 발생합니다. 이 문제를 해결하려면 (1) 제가 사용하고 있는 정규식 테스트 도구와 grep이 패턴을 구문 분석하는 방법 간의 차이점, (2) bash 이스케이프 문자 요구 사항 및 (3) 패턴 디자인을 모두 해결해야 한다고 생각합니다. 이 문제에 너무 많은 시간을 소비하기 전에 도움을 주셔서 감사합니다.

답변1

file"ls -l"이 제공하는 것보다 더 깊이 디렉토리 내용을 조사 해야 합니다 .

find . -type f

find명령은 고대 유닉스 마법입니다. 끝없는 정규식 인수로부터 당신을 구할 것입니다.

답변2

디렉토리 트리를 인쇄할 수 있는 것을 찾고 있다면 Steve Baker의 를 사용하는 것이 어떨까요 tree? (이것은 대부분의 배포판이 저장소에 포함하는 것입니다.)

맨페이지를 살펴봐야 하지만 다음과 같이 시작하면 됩니다.

tree -a -I '.git'

(dotfiles/-dirs를 포함하고, ".git"을 포함하는 항목은 제외)

답변3

실행한 첫 번째 명령은 끝에 콜론이 없기 때문에 표시되는 결과를 제공하지 않습니다. 참조하는 스크립트는 ls -R콜론이 추가되어 표시되는 디렉터리 경로를 선택하기 위해 이 작업을 수행하지만 파일 이름과 경로가 콜론으로 끝나고 잘못된 긍정을 제공하는 것을 방지할 수 있는 방법은 없습니다. 이는 또한 대부분의 디렉토리를 유지하고 일부만 제외하려는 제목을 오해하게 만듭니다.

질문은 다음과 같습니다. 정규식에는 여러 가지 "특성"(표준)이 있으며 가장 유사하지만 세부 사항에 있어 중요한 차이점이 있습니다. Unix와 Unix 파생 소프트웨어에는 BRE(기본 정규 표현식)와 ERE(확장 정규 표현식)라는 두 가지 일반적인 정규 표현식이 있습니다. 일치하는 파일 이름(및 대소문자 선택)의 더 간단한 형식은 대부분의 셸(및 표준 조회)(그냥 ? * 및 [...])에서 사용되며 정규 표현식이라고도 하지 않고 단지 패턴이라고 합니다. Perl은 좀 더 확장된 형식을 정의하지만 PCRE(Perl-Compatible Regular Expressions)라고 하는 외부에서 사용할 수 있는 형식을 정의합니다. 바라보다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까? 그리고http://en.wikipedia.org/wiki/Regular_Expression.

귀하의 (?!"예측"은 PCRE에만 있는 반면 표준은 grep기본적으로 BRE를 수행하거나 ERE를 사용 -E하지만 일부 버전에서는 grepPCRE를 수행할 수 있거나 별도의 pcregrep.하지만 필요하지 않습니다.curr dir의 숨겨지지 않은 하위 항목을 원하는 경우 원하는 정도에 따라 '^\./\w'or를 수행하십시오. '^\./[^.]'하지만 경로의 어느 곳에도 숨겨진 디렉터리가 존재하는 것을 원하지 않는다고 말씀하셨습니다. 이는 정규 표현식으로는 어렵고 grep -v '/\.'.

백슬래시는 bash(모두는 아니지만 대부분의 쉘) 및 grep(BRE 또는 ERE)에서 특별하므로 큰따옴표 \\나 작은따옴표를 선호합니다. 여기서는 큰따옴표만으로는 충분하지 않습니다.

더 좋은 방법: 실제로는 디렉토리 경로만 필요하므로 다른 답변에서 제안하는 것이 find -type d | grep -v /\.더 나은 접근 방식입니다. 이는 폐기할 일반 파일 이름을 나열하는 데 시간을 낭비하지 않습니다. 또는 ; 없이 사용할 수도 있습니다 ls -R | grep :$. 숨겨진 항목(일반 파일 및 디렉터리)은 -a기본적으로 이미 건너뛰어집니다. ls당신이 인용한 스크립트처럼요!

답변4

@dan-garthwaite가 말한 내용을 확장하면 find일반적으로 디렉터리 트리를 검색할 때 사용되는 도구입니다. 일반적인 구문은 다음과 같습니다.

find /path/to/search [one or more expressions]

가능한 모든 표현은 매뉴얼 페이지를 참조하세요. 그러나 몇 가지 편리한 표현은 다음과 같습니다:

-type x         # Where x = f for files, d for directories, s for sockets, etc.
-mtime x        # Where x = number of minutes since the file was last accessed
-name pattern   # Where pattern = a string to search for (use * for wildcard match)
-iname pattern  # Same as -name, but case insensitive
-size x         # Where x = size, human readable (eg. 500k, 20m, ...)
-user name      # Where name = owner of file

예를 들어, 5MB보다 큰 bob이 소유한 모든 jpg 파일에 대해 /home을 검색하려면 다음을 실행합니다.

find /home -user bob -size +5m -iname '*.jpg'

관련 정보