Reading filenames into an array
Solution 1:
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.
Solution 2:
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
Solution 3:
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
Solution 4:
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/