UNIX 명령 트리는 패턴과 일치하는 디렉터리만 표시할 수 있습니까?

UNIX 명령 트리는 패턴과 일치하는 디렉터리만 표시할 수 있습니까?

treeUNIX 명령 에서 특정 패턴과 일치하는 디렉터리만 표시 하도록 하는 방법이 있는지 알아내려고 노력 중입니다 .

% tree -d tstdir -P '*qm*' -L 1
tstdir
|-- d1
|-- d2
|-- qm1
|-- qm2
`-- qm3

5 directories

이것매뉴얼 페이지스위치에 대한 일부 정보를 표시합니다.

-P 모드는 와일드카드 패턴과 일치하는 파일만 나열합니다. 참고: 점 .' for matching. Valid wildcard operators are*'(0개 이상의 문자), ?' (any single character),[...]'(대괄호 사이에 나열된 단일 문자) 로 시작하는 파일을 고려하려면 -a 옵션을 사용해야 합니다 (문자 범위를 나타내려면 선택 사항 -( 대시)). 예를 들어 [AZ]) 및 [^...]' (any single character not listed in brackets) and|'를 사용하여 대체 패턴을 구분할 수 있습니다.

나는 대략 추측하고있다...해당 파일만 나열합니다...문제입니다. 이 스위치가 파일에 대해서만 패턴 일치를 수행한다는 내 해석이 맞습니까?아니요목차?

답변1

tree혼자서는 할 수 있는 방법이 없습니다 . 모드는 디렉터리에서는 작동하지 않고 파일에서만 작동합니다.

tree그러나 디렉터리 목록을 가져온 다음 일치하는 패턴을 적용 하면 원하는 것을 쉽게 달성할 수 있습니다 grep.

tree -d tstdir -L 1 | grep '*qm*'

답변2

누군가 언급됨스택 오버플로trees매뉴얼 페이지 에서 -P스위치가 패턴과 일치하지 않는 항목을 제외하지 않는 이유가 바로 이것입니다.

BUGS
   Tree  does not prune "empty" directories when the -P and -I options are
   used.  Tree prints directories as it comes to them, so  cannot  accumu‐
   late  information  on files and directories beneath the directory it is
   printing.

따라서 tree-P 스위치를 사용하여 출력을 필터링하는 것은 불가능해 보입니다.

편집 #1

내가 SO에 게시한 닫힌 질문에서. 누구,@fhauritree, 해당 명령으로 수행하려는 작업을 수행하는 대체 방법 으로 다음 정보를 게시했습니다 . 완전성을 위해 답변에 추가하겠습니다.

-d질문으로 전환아니요문서 인쇄:

    -d     List directories only.

따라서 이를 사용하고 싶다면 다음을 수행할 수 있습니다.

tree tstdir -P '*qm*' -L 1 | grep -B1 -- '-- .*qm'
|-- id1
|   `-- aqm_P1800-id1.0200.bin
--
|-- id165
|   `-- aqm_P1800-id165.0200.bin
|-- id166
|   `-- aqm_P1800-id166.0200.bin
--
|-- id17
|   `-- aqm_P1800-id17.0200.bin
--
|-- id18
|   `-- aqm_P1800-id18.0200.bin
--
|-- id2
|   `-- aqm_P1800-id2.0200.bin

-L 1전체적으로 , 당신이 사용한다면

   -L level
          Max display depth of the directory tree.

다음 구문을 (bash에서) 더 잘 사용할 수 있습니다.

cd tstdir
echo */*qm*

또는

printf "%s\n" */*qm*

dir만 필요한 경우:

printf "%s\n" */*qm* | sed 's|/.*$||' | uniq

어쨌든 만약에순수한 배쉬:

declare -A array;for file in  */*qm* ;do array[${file%/*}]='';done;echo "${!array[@]}"

이는 다음과 같이 해석될 수 있습니다.

cd tstdir
declare -A array          # Declare associative array, (named ``array'')
for file in  */*qm* ;do   # For each *qm* in a subdirectory from there
    array[${file%/*}]=''  # Set a entry in array named as directory, containing nothing
  done
echo "${!array[@]}"         # print each entrys in array.

...패턴과 일치하는 파일이 없으면 결과가 표시됩니다 *. 따라서 작업을 완벽하게 완료하려면 다음도 수행해야 합니다.

resultList=("${!array[@]}")
[ -d "$resultList" ] || unset $resultList

(이것보다는 낫겠지

declare -A array
for file in  */*qm*; do
    [ "$file" == "*/*qm*" ] || array[${file%/*}]=''
  done
echo "${!array[@]}"

)

관련 정보