tree
UNIX 명령 에서 특정 패턴과 일치하는 디렉터리만 표시 하도록 하는 방법이 있는지 알아내려고 노력 중입니다 .
% 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[@]}"
)