n 수준 깊이의 하위 디렉터리만 나열

n 수준 깊이의 하위 디렉터리만 나열

Festival은 다음 예제 디렉터리 구조에 voicepack 데이터를 저장합니다.

/usr/share/festival/voices/<language>/<voicepack name>

잠재적으로 수많은 하위 디렉토리 모두에서 '만 ls인쇄하는 가장 간단한 단일 라이너(가급적 사용)는 무엇입니까 ?<voicepack name><language>

답변1

저는 Fedora를 사용하고 있으며 이 음성팩의 위치는 약간 다릅니다.

$ ls /usr/share/festival/lib/voices/*/ -1 | grep -vE "/usr|^$"
kal_diphone
ked_diphone
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_rms_arctic_hts
nitech_us_slt_arctic_hts

다음과 같이 수정할 수 있습니다.

$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"

찾기 사용

이 저택에서 사용하는 것은 ls일반적으로 의 출력을 ls구문 분석하기 어렵기 때문에 눈살을 찌푸리게 합니다. 다음과 같이 명령 을 사용하는 것이 더 좋습니다 find.

$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
    -type d -exec basename {} \;
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone

찾기 및 기본 이름 세부정보

이 명령은 이 디렉터리와 관련하여 정확히 2레벨 깊이의 파일에 대한 전체 경로 목록을 생성하여 작동합니다.

/usr/share/festival/lib/voices

이 목록은 다음과 같습니다.

$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 
/usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_bdl_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_slt_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_jmk_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_clb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_rms_arctic_hts
/usr/share/festival/lib/voices/english/ked_diphone
/usr/share/festival/lib/voices/english/kal_diphon

하지만 우리는 이 디렉터리의 마지막 부분인 리프 노드를 원합니다. 따라서 다음을 사용하여 basename구문 분석할 수 있습니다.

$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts

이 모든 것을 종합하면 find명령이 각 2레벨 깊이 디렉터리를 basename명령에 전달하도록 할 수 있습니다. 표기법 basename {}은 이러한 기본 이름 변환을 수행하는 것입니다. Find는 스위치를 통해 호출합니다 -exec.

답변2

가장 쉬운 것은

ls -d /usr/share/festival/voices/*/*

이는 쉘에 의해 모든 하위 디렉토리로 확장된 /usr/share/festival/voices/다음 각 하위 디렉토리의 내용으로 확장됩니다.

find제목에서 알 수 있듯이 GNU 및 일부 BSD와 같은 일부 구현을 사용하여 특정 수준으로 내려가려는 경우 :

find /usr/share/festival/voices/ -mindepth 2 -maxdepth 3 -type d

그러면 -type d하위 디렉토리에 있지만 3레벨 이하( ) 이하인 모든 디렉토리( )가 검색됩니다 . 에서 :/usr/share/festival/voices/mindepth 2maxdepth 3man find

   -maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc‐
          tories below the command line arguments.  -maxdepth 0
           means only apply the tests and  actions  to  the  command  line
          arguments.

   -mindepth levels
          Do  not apply any tests or actions at levels less than levels (a
          non-negative integer).  -mindepth  1  means  process  all  files
          except the command line arguments.

답변3

그만큼수락된 답변올바르게 작동하지만 각 하위 디렉터리에 대해 새 basename프로세스를 생성하기 때문에 다소 비효율적입니다.

find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
    -type d -exec basename {} \;

find가능하다면 프로세스 생성 비용을 피하기 위해 내장된 기능을 사용하는 것이 좋습니다 . 작업 find을 사용하여 인쇄된 출력을 수정할 수 있는 상당히 광범위한 기능이 있습니다 -printf. 기본 -print 작업은 전체 경로를 인쇄하지만 -printf및 형식 문자열을 사용하면 인쇄할 경로의 일부를 선택할 수 있습니다. 선행 디렉터리 없이 경로의 파일 이름 부분만 추출하려면 basename 형식 문자열은 %f. 각 파일 이름 뒤에 줄바꿈을 추가하려면 \n다음을 포함하십시오.

$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
    -type d -printf '%f\n'
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone

답변4

ls를 사용하여 간단한 것을 찾고 있는 bash를 사용하는 사람의 경우:

ls -d $PWD/*

별칭을 만들 때(~/.bash_aliases 또는 어디에서든) 작은따옴표를 사용해야 합니다.

alias ldf='ls -d $PWD/*'

인용하지 않으면 쉘이 ls를 실행하려고 시도하게 됩니다.

큰따옴표로 묶으면 별칭 당시 $PWD 값으로 별칭이 생성됩니다.

원하는 경우 $(pwd)를 사용할 수 있지만 bash가 $PWD를 제공할 때 하위 쉘을 생성하는 지점이 표시되지 않습니다.

관련 정보