program tip

배열로 파일 이름 읽기

radiobox 2020. 12. 4. 08:04
반응형

배열로 파일 이름 읽기


파일 목록을 가져온 다음 각 배열 요소가 파일 이름에 해당하는 배열로 결과를 읽고 싶습니다. 이것이 가능한가?


사용하지 마십시오 ls, 그것은 것 아니다 이 목적을 위해. 글 로빙을 사용하십시오.

shopt -s nullglob
array=(*)
array2=(file*)
array3=(dir/*)

nullglob옵션을 사용하면 일치하는 항목이없는 경우 배열이 비어있게됩니다.


다음은 현재 디렉토리에 ls 출력이있는 배열 arr을 생성합니다.

arr=( $(ls) )

의 출력을 사용하는 ls것은 전혀 안전하지 않습니다.

ls사용할 수있는 것보다 훨씬 낫고 안전 합니다 echo *.

arr=( * )

echo ${#arr[@]} # will echo number of elements in array

echo "${arr[@]}" # will dump all elements of the array

사실, ls갈 길이 아닙니다. 이 시도:

declare -a FILELIST
for f in *; do 
    #FILELIST[length_of_FILELIST + 1]=filename
    FILELIST[${#FILELIST[@]}+1]=$(echo "$f");
done

배열에서 파일 이름을 얻으려면 다음을 사용하십시오.

echo ${FILELIST[x]}

x에서 시작하는 배열에서 n 개의 파일 이름을 얻으려면 다음을 사용하십시오.

echo ${FILELIST[@]:x:n}

bash 배열에 대한 훌륭한 자습서는 http://www.thegeekstuff.com/2010/06/bash-array-tutorial/을 참조하십시오.


bash에서는 다음과 같이 경로 이름 확장 (globbing)을 사용하여 파일 이름 배열을 만들 수 있습니다 .

#!/bin/bash
SOURCE_DIR=path/to/source
files=(
   "$SOURCE_DIR"/*.tar.gz
   "$SOURCE_DIR"/*.tgz
   "$SOURCE_DIR"/**/*
)

위의 방법은라는 배열을 생성하고 files여기에 N 배열 요소를 추가합니다. 배열의 각 요소 SOURCE_DIR.tar.gz또는 끝나는 항목 또는 .tgzDennis 가 주석에서 지적한 대로 하위 디렉터리 재귀가 가능한 하위 디렉터리의 항목 에 해당합니다.

그런 다음을 사용 printf하여 경로를 포함한 배열의 내용을 볼 수 있습니다 .

printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz

또는 매개 변수 대체사용 하여 경로 이름을 제외합니다.

printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz

이 시도,

path="" # could set to any absolute path
declare -a array=( "${path}"/* )

나중에 목록에서 원하지 않는 항목을 제거 할 것이라고 가정합니다.

참고 URL : https://stackoverflow.com/questions/10981439/reading-filenames-into-an-array

반응형