我想从当前目录列表中提取一个特殊格式的数组。
$ ls
Output:
fileABC.ext1
filePQR.ext2
dirMNO
dirFGH
我只想要特定扩展名的目录和文件
我想要一个这样的数组
(1 dirFGH "is a dir" 2 dirMNO "is a dir" 3 fileABC.ext1 "is an ext1 file")
我正在做同样的事情
num=0
while read -r line
do
if [ -d $line ]
then
num=$(( $num + 1 ))
array+=(num)
array+=($line)
array+=("Is a dir")
elif #check for extension used
then
num=$(( $num + 1 ))
array+=(num)
array+=($line)
array+=("Is an ext1 file")
fi
done < <(ls -1 --group-directories-first "$path")
但是这种方法比较慢。请向我推荐一种功能相同但经过优化的方法。
没必要解析
ls
。请记住每次使用诸如 之类的变量时都要用双引号引起来"$line"
,否则它会受到拆分$IFS
(通常是空格)和通配的影响。(例如,如果$line
是,hello world
那么您array+=($line)
将添加两个值,hello
和world
。)输出
该表达式
$((${#array[@]} /3 +1))
根据数组中已有的三元组值的数量计算条目数,这意味着我们不需要携带$num
.可能的改进
如果您正在寻找特定类型的文件,您可以使用
file
. 例如,file x.ods
在我的 PC 上返回x.ods: OpenDocument Spreadsheet
.您可能会发现使用两个不同的数组更容易,一个用于文件名,一个用于自定义文件类型消息:
此处的索引值 (
$num
) 可以直接由项目的索引导出,您不需要将其存储在自己的数组中。用
zsh
代替bash
:请注意
zsh
,与在 csh/tcsh 中一样, in$path
是绑定到$PATH
(指定在其中搜索命令的目录列表的标准环境变量)的特殊数组,不能用作普通变量,因此在$dir
上面使用。