답변:
저는 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 {}
은 이러한 기본 이름 변환을 수행하는 것입니다. -exec
스위치 를 통해 전화를 찾습니다 .
-exec basename {}
위해 여기서 설명해 주시겠습니까?
find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
크기에 따라 정렬 된 가장 큰 디렉토리를 찾습니다
가장 쉬운 방법은
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
하위 디렉토리 /usr/share/festival/voices/
에 mindepth 2
있지만 3 레벨 이하인 모든 디렉토리 ( )를 찾을 수 있습니다 ( 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.
-type f
하기 -type d
바로,이 문제를 해결해야합니까? 또한의 목적에 대한 SLM의 응답에 대기-exec basename {}
-type d
디렉토리를 찾습니다. 이것은 basename
매우 좋은 생각입니다. 이름 만 인쇄하고 경로를 제거합니다. 이름 만 원한다고 가정하면 그렇게해야합니다. man basename
또한 살펴보십시오 man dirname
.
허용 대답은 그것이 새로운 급부상 때문에 제대로 작동하지만 다소 비효율적이며 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
find
있으며 임의의 외부 명령과 함께 사용하는보다 일반적인 패턴을 다룹니다 . 내장 된 작업에는 효율성이 떨어집니다 find
. 나는 그의 답변에 의견을 추가하는 것을 고려했지만, 그것은 나보다 더 명성이 필요합니다. 현재 승인 된 답변이 정확하고 잘 설명되어 있으며보다 일반적인 경우의 패턴으로 사용할 수 있으므로 승인 된 답변을 변경할 필요가 없습니다. 나는이 특별한 경우보다 효율적인 방법이 있음을 지적하고 싶었습니다.