假设我有这样的目录结构:
DIRECTORY:
.........a
.........b
.........c
.........d
我想要做的是:我想将目录的元素存储在数组
中类似于:array = ls /home/user/DIRECTORY
以便array[0]
包含第一个文件的名称(即'a')
array[1] == 'b'
等。
感谢您的帮助
答案 0 :(得分:11)
你不能简单地做array = ls /home/user/DIRECTORY
,因为 - 即使使用正确的语法 - 它也不会给你一个数组,而是一个你必须解析的字符串,Parsing ls
is punishable by law。但是,您可以使用内置的Bash结构来实现您的目标:
#!/usr/bin/env bash
readonly YOUR_DIR="/home/daniel"
if [[ ! -d $YOUR_DIR ]]; then
echo >&2 "$YOUR_DIR does not exist or is not a directory"
exit 1
fi
OLD_PWD=$PWD
cd "$YOUR_DIR"
i=0
for file in *
do
if [[ -f $file ]]; then
array[$i]=$file
i=$(($i+1))
fi
done
cd "$OLD_PWD"
exit 0
这个小脚本保存了$YOUR_DIR
中可以在名为array
的数组中找到的所有常规文件的名称(这意味着没有目录,链接,套接字等)。
希望这有帮助。
答案 1 :(得分:5)
选项1,手动循环:
dirtolist=/home/user/DIRECTORY
shopt -s nullglob # In case there aren't any files
contentsarray=()
for filepath in "$dirtolist"/*; do
contentsarray+=("$(basename "$filepath")")
done
shopt -u nullglob # Optional, restore default behavior for unmatched file globs
选项2,使用bash数组技巧:
dirtolist=/home/user/DIRECTORY
shopt -s nullglob
contentspaths=("$dirtolist"/*) # This makes an array of paths to the files
contentsarray=("${contentpaths[@]##*/}") # This strips off the path portions, leaving just the filenames
shopt -u nullglob # Optional, restore default behavior for unmatched file globs
答案 2 :(得分:1)
array=($(ls /home/user/DIRECTORY))
然后
echo ${array[0]}
将等于该目录中的第一个文件。