当前目录中的项目列表中的特殊数组

当前目录中的项目列表中的特殊数组

我想从当前目录列表中提取特殊格式的数组。

$ 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)将添加两个值,helloworld。)

#!/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在上面使用。

相关内容