Reading filenames into an array

前端 未结 5 2042
青春惊慌失措
青春惊慌失措 2020-11-29 18:30

I want to get a list of files and then read the results into an array where each array element corresponds to a file name. Is this possible?

相关标签:
5条回答
  • 2020-11-29 18:59

    Following will create an array arr with ls output in current directory:

    arr=( $(ls) )
    

    Though using output of ls is not safe at all.

    Much better and safer than ls you can use echo *:

    arr=( * )
    
    echo ${#arr[@]} # will echo number of elements in array
    
    echo "${arr[@]}" # will dump all elements of the array
    
    0 讨论(0)
  • 2020-11-29 19:02

    In bash you can create an array of filenames with pathname expansion (globbing) like so:

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

    The above will create an array called files and add to it N array elements, where each element in the array corresponds to an item in SOURCE_DIR ending in .tar.gz or .tgz, or any item in a subdirectory thereof with subdirectory recursion possible as Dennis points out in the comments.

    You can then use printf to see the contents of the array including paths:

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

    Or using parameter substitution to exclude the pathnames:

    printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
    
    0 讨论(0)
  • 2020-11-29 19:03

    Try this,

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

    I'm assuming you'll pull out the unwanted stuff from the list later.

    0 讨论(0)
  • 2020-11-29 19:08

    Actually, ls isn't the way to go. Try this:

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

    To get a filename from the array use:

    echo ${FILELIST[x]}
    

    To get n filenames from the array starting from x use:

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

    For a great tutorial on bash arrays, see: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

    0 讨论(0)
  • 2020-11-29 19:17

    Don't use ls, it's not intended for this purpose. Use globbing.

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

    The nullglob option causes the array to be empty if there are no matches.

    0 讨论(0)
提交回复
热议问题