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

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

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

/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/다음 각 하위 디렉터리의 내용으로 확장합니다.

제목에 표시된 특정 수준으로 내려가 findGNU 및 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

Bash를 사용하는 사람들은 ls를 사용하여 간단한 것을 찾으십시오.

ls -d $PWD/*

~/.bash_aliases 또는 다른 곳에서 별칭을 생성할 때 작은따옴표를 사용해야 합니다.

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

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

별칭을 생성할 때 큰따옴표는 $PWD 값을 사용하여 별칭을 생성합니다.

원하는 경우 $(pwd)를 사용할 수 있지만 bash가 $PWD를 제공할 때 하위 쉘을 생성하는 것이 의미가 없습니다.

관련 정보