bash列出文件夹中的所有子目录,将它们写入数组以在菜单中使用

迈克·阿特金森

我正在编写bash脚本,在某个目录中有多个子文件夹,我想列出这些子文件夹的名称,并将结果读入数组,并从结果中省略某个名为“ cmmdm”的单个文件夹。将名称读入数组后,我想生成一个菜单,其中每个子菜单名称都作为选择,然后我将根据用户做出的选择在给定的子文件夹上执行功能。

编辑:对不起,应该添加我的初始代码:

#!/bin/bash
# - create array
declare -a CDARRAY

# - set 0 to exit in prep for menu
CDARRAY[0]=exit

# - create a counter to use in while loop
count=1

# - while loop to itterate through folder and add each folder except cmmdm into array
ls -d /home/nginx/domains/* | {
    while read CMMDOMAIN ; do

            if [ $CMMDOMAIN != "/home/nginx/domains/cmmdm" ]
            then
            $CDARRAY[$count]=$CMMDOMAIN
            echo $CDARRAY[$count]
            count=$[count + 1]
            fi

    done
}

这确实会通过文件夹,并且不会忽略“ cmmdm”,但是将变量CMMDOMAIN添加到数组的代码是错误的。我以前从未用bash编写过脚本,所以我认为我可能语法错误或缺少大括号或其他内容

gniourf_gniourf

您的代码有很多问题,这里有太多问题(没有冒犯)。

这是一个完整的示例,它将根据需要显示菜单,并进行一些常规检查:

#!/bin/bash

shopt -s extglob nullglob

basedir=/home/nginx/domains

# You may omit the following subdirectories
# the syntax is that of extended globs, e.g.,
# omitdir="cmmdm|not_this_+([[:digit:]])|keep_away*"
# If you don't want to omit any subdirectories, leave empty: omitdir=
omitdir=cmmdm

# Create array
if [[ -z $omitdir ]]; then
   cdarray=( "$basedir"/*/ )
else
   cdarray=( "$basedir"/!($omitdir)/ )
fi
# remove leading basedir:
cdarray=( "${cdarray[@]#"$basedir/"}" )
# remove trailing backslash and insert Exit choice
cdarray=( Exit "${cdarray[@]%/}" )

# At this point you have a nice array cdarray, indexed from 0 (for Exit)
# that contains Exit and all the subdirectories of $basedir
# (except the omitted ones)
# You should check that you have at least one directory in there:
if ((${#cdarray[@]}<=1)); then
    printf 'No subdirectories found. Exiting.\n'
    exit 0
fi

# Display the menu:
printf 'Please choose from the following. Enter 0 to exit.\n'
for i in "${!cdarray[@]}"; do
    printf '   %d %s\n' "$i" "${cdarray[i]}"
done
printf '\n'

# Now wait for user input
while true; do
    read -e -r -p 'Your choice: ' choice
    # Check that user's choice is a valid number
    if [[ $choice = +([[:digit:]]) ]]; then
        # Force the number to be interpreted in radix 10
        ((choice=10#$choice))
        # Check that choice is a valid choice
        ((choice<${#cdarray[@]})) && break
    fi
    printf 'Invalid choice, please start again.\n'
done

# At this point, you're sure the variable choice contains
# a valid choice.
if ((choice==0)); then
    printf 'Good bye.\n'
    exit 0
fi

# Now you can work with subdirectory:
printf "You chose subdirectory \`%s'. It's a good choice.\n" "${cdarray[choice]}"

这些评论应该很清楚地解释正在发生的事情。用于构建数组的技术(这就是您提出问题的目的)是扩展的globs例如:

shopt -s extglob nullglob
cdarray=( /home/nginx/domains/!(cmmdm)/ )

将填充cdarray所有/home/nginx/domains/不匹配的子目录cmmdm(完全匹配)。具有不以a结尾的所有子目录b

shopt -s extglob nullglob
cdarray=( /home/nginx/domains/!(*[ab])/ )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何下载包含在线文件/文件夹列表中的所有文件和子目录的HTTP目录?

在Yosemite上使用JavaScript for Automation列出文件夹中的所有文件

没有列出子目录的文件夹的Powershell文件夹大小

使用bash terminal命令打开目录和子目录中的所有文件?

如何使用angular js列出文件夹中的所有文件名

Python递归遍历所有子目录,并将文件名写入输出文件

列出SQL Server父文件夹中的所有文件夹子目录

从所有子目录删除文件,保留一个子目录以外的文件夹结构

GraphQL查询访问子目录下文件夹中的所有已转换json文件

使文件夹中的所有文件可被所有项目(子目录)访问

在文件夹的所有子目录中创建相同的文件夹

在Mac OS X中使用命令行“ zip”工具递归压缩目录和子目录中的文件,并从所有子文件夹中排除.DS_Store文件

如何在Linux shell中使用`ls`列出文件,因为它们在相应的文件夹中列出

git排除文件夹中除子目录外的所有内容

sftp:上传文件夹中包含的所有文件,目录和子目录

尝试将目录中的所有子目录打包为rar,而不是其中包含文件夹的子目录为rar

bash列出所有目录,子目录,文件夹,子文件夹,然后输出到单独的文件

bash脚本,该脚本在子目录中找到特定的文件夹并在所有目录中递归创建目录

如何使用Grunt压缩子文件夹/子目录中的所有JavaScript文件?

列出目录中的文件,不递归,只列出文件,不列出子目录,使用 C++

如何将所有子目录移动到bash中的父文件夹中?

Shell脚本列出文件夹中的所有目录并为每个目录运行命令

在特定目录及其子目录中,找到所有以 .tmp 扩展名结尾的文件夹

重命名所有子目录中的文件和文件夹以删除字符

列出子目录中的所有文件,按子目录名称排序

如何解压缩我的子目录中的所有 zip 文件夹?

使用 Robocopy 更新功能将子目录中的所有文件复制到单个文件夹

如何在多个子目录中找到相同扩展名的所有文件并使用 python 将它们移动到单独的文件夹?

使用 Powershell 重命名当前目录中包含文件和子目录的所有文件夹名称