[arrays] Linux Bash의 배열에 ls를 어떻게 할당합니까?

array=${ls -d */}
echo ${array[@]}

세 개의 디렉토리가 있습니다 : ww ee qq. 나는 그것들을 배열로 원하고 배열을 인쇄합니다.



답변

이거

array=($(ls -d */))

편집 :보다 일반적인 답변은 Gordon Davisson의 솔루션을 참조하십시오 (즉, 파일 이름에 특수 문자가 포함 된 경우). 이 대답은 단지 구문 수정일뿐입니다.


답변

가능할 때마다의 출력을 구문 분석하지 않아야 합니다 (주제에 대한 Greg의 위키ls 참조 ). 기본적으로 파일 이름에 재미있는 문자가 있으면 의 출력 이 모호합니다. 또한 일반적으로 시간 낭비입니다. 이 경우를 실행 하면 셸 이 하위 디렉터리 목록 (이미 원하는대로)으로 확장 되고 해당 목록을에 인수로 전달합니다. 각 목록 은 “예, 디렉터리입니다. all right “를 표시하고 인쇄합니다 (일관되지 않고 때로는 모호한 형식으로). 이 명령은 유용한 일을하지 않습니다!lsls -d */*/ls -dls

음, 좋습니다 . 유용한 한 가지 작업을 수행하고 있습니다. 하위 디렉터리가없는 경우 */그대로 남겨두고 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[@]}"


답변