我想从当前目录列表中提取特殊格式的数组。
$ 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")
但这种方法比较慢。请建议我一个功能相同但优化的方法。
答案1
没必要去解析ls
。请记住每次使用变量(例如 )时都使用双引号"$line"
,否则它将受到分割$IFS
(通常是空格)和通配符的影响。 (例如,如果$line
是,hello world
那么您array+=($line)
将添加两个值,hello
和world
。)
#!/bin/bash
array=()
for item in *
do
if [[ -d "$item" ]]
then
# Directory
array+=( $((${#array[@]} /3 +1)) "$item" 'is a dir' )
elif [[ -f "$item" ]] && [[ "$item" = *.ext1 ]]
then
# Files with an ext1 suffix
array+=( $((${#array[@]} /3 +1)) "$item" 'is an ext1 file' )
fi
done
# Dump the array
printf "%2d. '%s' %s\n" "${array[@]}"
输出
1. 'dirFGH' is a dir
2. 'dirMNO' is a dir
3. 'fileABC.ext1' is an ext1 file
该表达式$((${#array[@]} /3 +1))
根据数组中已有的三元组值的数量计算条目编号,这意味着我们不需要进位$num
。
可能的改进
如果您正在查找特定类型的文件,您可以使用 来检查它们file
。例如,file x.ods
在我的电脑上返回x.ods: OpenDocument Spreadsheet
.
您可能会发现使用两个不同的数组更容易,一个用于文件名,一个用于自定义文件类型消息:
filenames+=("$item")
filetypes+=('Is a dir')
这里的索引值 ( $num
) 可以直接通过项目的索引导出,而无需将其存储在自己的数组中。
答案2
用zsh
而不是bash
:
array=() n=0
for f ( $dir/*(N-/) ) array+=( $((++n)) $f:t 'is a dir' )
for f ( $dir/*.ext1(N^-/) ) array+=( $((++n)) $f:t 'is a ext1 non-directory file' )
请注意zsh
, in 与 csh/tcsh 中一样,$path
是绑定到的特殊数组$PATH
(指定在其中搜索命令的目录列表的标准环境变量),并且不能用作普通变量,因此$dir
在上面使用。