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 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
ls를 사용하여 간단한 것을 찾고 있는 bash를 사용하는 사람의 경우:
ls -d $PWD/*
별칭을 만들 때(~/.bash_aliases 또는 어디에서든) 작은따옴표를 사용해야 합니다.
alias ldf='ls -d $PWD/*'
인용하지 않으면 쉘이 ls를 실행하려고 시도하게 됩니다.
큰따옴표로 묶으면 별칭 당시 $PWD 값으로 별칭이 생성됩니다.
원하는 경우 $(pwd)를 사용할 수 있지만 bash가 $PWD를 제공할 때 하위 쉘을 생성하는 지점이 표시되지 않습니다.