array=${ls -d */}
echo ${array[@]}
세 개의 디렉토리가 있습니다 : ww
ee
qq
. 나는 그것들을 배열로 원하고 배열을 인쇄합니다.
답변:
이거
array=($(ls -d */))
편집 :보다 일반적인 답변은 Gordon Davisson의 솔루션을 참조하십시오 (즉, 파일 이름에 특수 문자가 포함 된 경우). 이 대답은 단지 구문 수정일뿐입니다.
ARR+=('$(ls -d */)')
, 배열의 요소를 편집 하는 데 내장을 사용하고 , 특수 문자를 처리하기 위해 작은 따옴표를 사용하여 요소를 추가하거나 제거합니다. 정렬. 작은 따옴표는 리터럴 문자를 보존하고 디렉토리 이름에서 처리하기 위해 이스케이프가 필요하지 않도록합니다.
declare -a ARR; ARR+=('$(ls -d "$INPUT_DIR"/*)')
반환 만$(ls -d $INPUT_DIR/*)
ARR+=("$(ls -d */)")
작동해야합니다. 그냥 알려주지 않으면.
가능할 때마다의 출력을 구문 분석하지 않아야 합니다 (주제에 대한 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
/
dir 이름에을 원하지 않으면 어떻게합니까?
ls
간단한 명령입니다. 출력은 문자열입니다. Bash는 문자열 구문 분석에 지나치게 능숙합니다. 적절한 정규식은 ls
출력 을 안전하게 구문 분석하는 데 필요한 모든 것입니다 .
ls
파일 이름에 재미있는 / 인쇄되지 않는 문자로 다른 작업 을 수행하므로 출력을 파일 이름 목록으로 구문 분석하는 일관된 방법이 없습니다. 그리고 내가 말했듯이 실제로 유용한 작업을 수행하지 않습니다.의 출력을 올바르게 구문 분석하면 ls -d */
직접 얻을 수있는 것과 똑같은 결과를 얻게됩니다 */
(일치하는 항목이없고 확인하기 쉬운 경우 제외).
A lazy sysadmin is a good sysadmin.
아마도 내 자신의 ls
파싱은 내가 가지고 있거나 익숙한 버전에 따라 다르지만 지금까지 내가 테스트 한 Linux 배포판에는 문제가 없었습니다. 나는 경험으로 만 말할 수 있습니다.
그러면 해당 디렉토리의 파일이 한 줄씩 인쇄됩니다.
array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"