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/
다음 각 하위 디렉터리의 내용으로 확장합니다.
제목에 표시된 특정 수준으로 내려가 find
GNU 및 BSD 등의 일부 구현을 사용하려는 경우:
find /usr/share/festival/voices/ -mindepth 2 -maxdepth 3 -type d
-type d
그러면 하위 디렉토리 내에 있는 3레벨 이하의 /usr/share/festival/voices/
모든 디렉토리를 찾습니다 ( ) . 에서 :mindepth 2
maxdepth 3
man 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를 제공할 때 하위 쉘을 생성하는 것이 의미가 없습니다.