array=${ls -d */}
echo ${array[@]}
세 개의 디렉토리가 있습니다 : ww
ee
qq
. 나는 그것들을 배열로 원하고 배열을 인쇄합니다.
답변
이거
array=($(ls -d */))
편집 :보다 일반적인 답변은 Gordon Davisson의 솔루션을 참조하십시오 (즉, 파일 이름에 특수 문자가 포함 된 경우). 이 대답은 단지 구문 수정일뿐입니다.
답변
가능할 때마다의 출력을 구문 분석하지 않아야 합니다 (주제에 대한 Greg의 위키ls
참조 ). 기본적으로 파일 이름에 재미있는 문자가 있으면 의 출력 이 모호합니다. 또한 일반적으로 시간 낭비입니다. 이 경우를 실행 하면 셸 이 하위 디렉터리 목록 (이미 원하는대로)으로 확장 되고 해당 목록을에 인수로 전달합니다. 각 목록 은 “예, 디렉터리입니다. all right “를 표시하고 인쇄합니다 (일관되지 않고 때로는 모호한 형식으로). 이 명령은 유용한 일을하지 않습니다!ls
ls -d */
*/
ls -d
ls
음, 좋습니다 . 유용한 한 가지 작업을 수행하고 있습니다. 하위 디렉터리가없는 경우 */
그대로 남겨두고 ls
“*”라는 하위 디렉터리를 찾고, 찾지 못하고, 존재하지 않는다는 오류 메시지를 인쇄합니다. stderr), “* /”( 표준 출력으로)를 인쇄 하지 않습니다 .
하위 디렉토리 이름 배열을 만드는 더 깨끗한 방법은 glob ( */
) 을에 전달 하지 않고 사용 하는 것 ls
입니다. 그러나 실제 하위 디렉토리가없는 경우 배열에 “* /”를 넣지 않으려면 먼저 nullglob을 설정해야합니다 (다시 한 번 Greg ‘s wiki 참조 ).
shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}" # Note double-quotes to avoid extra parsing of funny characters in filenames
하위 디렉터리가없는 경우 오류 메시지를 인쇄하려면 직접 수행하는 것이 좋습니다.
if (( ${#array[@]} == 0 )); then
echo "No subdirectories found" >&2
fi
답변
그러면 해당 디렉토리의 파일이 한 줄씩 인쇄됩니다.
array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"