Bash;在文件夹编号时检查文件夹是否存在

Bash; check if a folder exist while the folders are numbered

我有一系列文件夹(A1、A2、...)和一些子文件夹,但我只需要检查遵循这种模式的子文件夹 0$n_st*,我不需要检查其余部分子文件夹数:

A1/
        01_stjhs_lkk/
        02_stlkd_ooe/
        03_stoie_akwe/
        ...
A2/
        01_stpw_awq/
        02_stoe_iwoq/
        03_stak_weri/
        ...
...

我想找到数量最多的子文件夹(0$n)(子文件夹的数量因文件夹而异),然后转到子文件夹和grep一些东西并重复这个过程其他文件夹(A1、A2、...)这是我的脚本,它不起作用(似乎 if 条件有问题)

for dd in */; do 
   cd "$dd" # A1, A2,...
       for num in {8,7,6,5,4,3,2,1}; do
               if [  -d 0${num}_st* ]; then
                  echo "0${num}_st*"
                  cd "0${num}_st*"
                  echo $(grep -i 'xyz       f' 04_*.log) #grep this line from log file
                  break
               fi
               cd ..
       done
       cd ..
done

直接的问题是,如果 ... 是匹配多个文件的通配符,if [ -d ... ] 将产生语法错误。您可以通过多种方式解决此问题,但可能符合您(模糊)要求的最简单方法是

for dd in */; do
    for dir in "$dd"/0[0-9]_st*/; do
        : nothing
    done
    # the variable `$dir` will now contain the alphabetically last match
    grep -i 'xyz       f' "$dir"/04_*.log
done

如果目录的名称中包含不同位数的数字,则按字母顺序对它们进行排序将不起作用(2 将排在 19 之后)但是您的示例在所有情况下仅显示具有两位数字的名称,因此让我们假设它具有代表性。

演示:https://ideone.com/1N2Iui

这里有一个变体,展示了使用 sort -n 查找最大数字的不同方法,因此它也适用于具有可变数字位数的目录。

for dd in */; do
    biggest=$(printf '%s\n' "$dd"/0*_st*/ | sort -d / -k2,2n | tail -n 1)
    grep -i 'xyz       f' "$biggest"/04_*.log
done

因为通配符已经以 / 结尾,例如 / 之后"$dd"/ 严格来说是多余的,但无害。如果它打扰了你(或者你在一个奇怪的系统上,双斜杠对文件系统有特殊意义),你可以把它去掉(以牺牲一些易读性为代价)。

建议 find 命令。

find . -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1

注意这个查找命令递归扫描当前目录下的所有个目录。

为了将 find 命令限制到特定目录 dir1 dir2 您需要在 -type 选项之前指定它们。

find dir1 dir2 -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1

说明

  • find . -type d
    打印当前目录下的所有目录和子目录

  • find . -type d -printf "%f\n"
    仅打印目录名称,不打印目录路径。

  • grep "^0"
    仅过滤以 0

    开头的目录名称

    如果匹配的目录多于需要的目录, 也可能优化 grep 过滤器:grep "^0[[:digit:]]\+_"

  • sort -n
    按数字对目录名称排序

  • tail -n1
    打印最后一个目录