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


답변:


111

이거

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

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


14
디렉토리 이름에 공백이 있으면 올바르게 작동하지 않습니다.
chepner

1
공백 또는 특수 문자 문제를 해결하려면 먼저 값없이 배열을 선언 한 다음 ARR+=('$(ls -d */)'), 배열의 요소를 편집 하는 데 내장을 사용하고 , 특수 문자를 처리하기 위해 작은 따옴표를 사용하여 요소를 추가하거나 제거합니다. 정렬. 작은 따옴표는 리터럴 문자를 보존하고 디렉토리 이름에서 처리하기 위해 이스케이프가 필요하지 않도록합니다.
Yokai

@Yokai 귀하의 제안은 훌륭하게 들리지만 Ubuntu 16.04 또는 MacO에서 작동하지 않았습니다. Bash는 다음과 같이 작은 따옴표 사이에 코드를 확장합니다. declare -a ARR; ARR+=('$(ls -d "$INPUT_DIR"/*)')반환 만$(ls -d $INPUT_DIR/*)
Agile Bean

1
내 실수. 명령 대체를 확장 할 수 있도록 큰 따옴표 여야합니다. ARR+=("$(ls -d */)")작동해야합니다. 그냥 알려주지 않으면.
Yokai

2
@Yokai, 디렉토리 당 하나의 요소가 아닌 총 하나의 요소 만 추가합니다 (많은 줄 바꿈 포함).
Charles Duffy

79

가능할 때마다의 출력을 구문 분석하지 않아야 합니다 (주제에 대한 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

2
귀하의 의견을 보내 주셔서 감사합니다. 답변으로 표시되지 않았지만 매우 유익했으며 감사합니다.
제이크 H

/dir 이름에을 원하지 않으면 어떻게합니까?
shinzou

그렉의 위키에 설명 된 문제 / 문제는 단순한 조건부 구조로는 쉽게 다룰 수없는 것이 아닙니다. ls간단한 명령입니다. 출력은 문자열입니다. Bash는 문자열 구문 분석에 지나치게 능숙합니다. 적절한 정규식은 ls출력 을 안전하게 구문 분석하는 데 필요한 모든 것입니다 .
Yokai

@Yokai 다른 버전은 ls파일 이름에 재미있는 / 인쇄되지 않는 문자로 다른 작업 을 수행하므로 출력을 파일 이름 목록으로 구문 분석하는 일관된 방법이 없습니다. 그리고 내가 말했듯이 실제로 유용한 작업을 수행하지 않습니다.의 출력을 올바르게 구문 분석하면 ls -d */직접 얻을 수있는 것과 똑같은 결과를 얻게됩니다 */(일치하는 항목이없고 확인하기 쉬운 경우 제외).
고든 데이비슨

요약하면 : A lazy sysadmin is a good sysadmin.아마도 내 자신의 ls파싱은 내가 가지고 있거나 익숙한 버전에 따라 다르지만 지금까지 내가 테스트 한 Linux 배포판에는 문제가 없었습니다. 나는 경험으로 만 말할 수 있습니다.
Yokai

8

그러면 해당 디렉토리의 파일이 한 줄씩 인쇄됩니다.

array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.