2016-11-07 2 views
1

배열의 내용을 디렉토리 안에 저장할 수 있기를 원합니다. 나는 당신이 사용할 수 있습니다 :배열의 내용을 배열 안에 저장하는 방법

#!/bin/bash 

declare -A array 

for i in Directory; do 
    array[$i]=$i 
done 

연관 배열에 디렉토리 내용을 저장합니다. 그러나 디렉토리 안에 하위 디렉토리가있는 경우 동일한 배열 내에 하위 디렉토리를 저장할 수 있기를 원합니다. 또한 사용하여 시도 :

declare -A arr1  

find Directory -print0 | while read -d $'\0' file; do 
     arr1[$file]=$file 
     echo "${arr1[$file]}" 
    done 

을하지만 이것은 단지 때문에 (나는 상황을 제대로 설명하고 있습니다 경우 확실하지) 서브 쉘이 파이프 라인에서 삭제되기에 while 루프가 종료되면 배열의 내용이 사라지는 문제로 실행됩니다.

for i in $(find Directory/*); do 
    arr2[$i]="$i" 
    echo $i 
done 

하지만 출력에 공백이 포함 된 파일에 대한 재앙이다 :

가 난 다음을 시도했다.

디렉토리와 그 하위 디렉토리 (필요한 경우 하위 디렉토리)를 모두 단일 어레이에 저장할 수있는 방법은 무엇입니까?

+1

이 게시물을 탐색 해보십시오. http://stackoverflow.com/questions/11584029/how-can-i-store-a-list-of-directories-in-an-array –

+0

http : // mywiki를 참조하십시오. .wooledge.org/BashGuide/Arrays – andlrc

+0

아카이브 하시겠습니까? 왜 배열을 사용해야합니까? – andlrc

답변

0

아시다시피 연관 배열이 필요하지 않습니다. 일반 인덱스 배열에 요소를 추가하는 간단한 방법은 다음과 같습니다

array+=("$value") 

귀하의 find|while 접근 방식이 올바른 궤도에있다. 추측했듯이 파이프 라인을 제거해야합니다. 당신은 프로세스 대체와 함께이 작업을 수행 할 수 있습니다

while read -d $'\0' file; do 
    arr1+=("$file") 
done < <(find Directory -print0) 

find없이이 작업을 수행하는 또 다른 방법은 글 로빙 함께.

array=(Directory/*) 

당신은뿐만 아니라 모든 서브 디렉토리를 재귀하려는 경우 globstar을 활성화하고 ** 사용할 수 있습니다 :

shopt -s globstar 
array=(Directory/**) 

대체 (globbing)을 방금 Directory 아래에있는 파일을 원하는 경우로는 간단합니다 공백 문자와 다른 특수 문자로 파일 이름을 자동으로 처리하기 때문에 메서드가 정말 좋습니다.

+1

나는 OP가 그들이 원하는 것을 확신하지 못한다. 대답은 다음과 같을 것이라고 가정한다 :'my_arr = (Directory/*)' – andlrc

+0

globstar와 pathname 확장에 대한 가장 큰 단점은 확장 된 경로 이름이 메모리에 저장된다는 것이다. 그들의). 모든 경로 이름이 확장 될 때까지 실행이 지연됩니다. OP가 배열에 결과를 저장하려는 경우 고려하면 문제가되지 않을 수 있습니다. OP가 왜 배열이 필요한지 묻는 질문이 있습니다. – andlrc

+0

@ John Kugleman, 고마워요! 공정 교체는 내가 원한 것을 위해 잘 작동했다. 구문은''-d $ '\ 0'파일을 읽는 동안은 안된다. do arr1 + = ("$ file") 완료 <<(찾을 디렉토리 -print0)'' – Alphatron

-2

재귀 호출을 사용하십시오. 예 :

항목을 배열에 추가하는 방법과 항목이 디렉토리인지 아닌지 확인하는 방법을 확인해야합니다.

+0

그 의사 코드가 맞습니까? 그것은 bash 스크립트가 아닙니다. –

관련 문제