扩展接收路径

时间:2019-04-11 10:32:33

标签: bash shell loops path

作为用于计数任何已接收目录中项目的脚本的一部分,我还需要递归检查任何子目录。 为此,我需要扩展给定的参数并向其添加子目录的路径,例如:对于具有子目录sub1和sub2的/ path / dir1,我需要将参数编辑为/ path / dir1 / sub1和/ path / dir1 / sub2并在其上运行脚本。 我尝试了不同的方法,但无法正确完成。

在for循环中,我尝试将子目录添加到给定的路径,但是它似乎对我不起作用。

  • script1.sh让我了解一个文件夹中的项目数。
  • script2.sh打印子目录的名称,并在它们之间留一个空格。

代码:

#!/bin/bash

dir=$1
count=0
a="$(source script1.sh)"
((count=count+a+1))
b="$(source script2.sh)"
c="$(wc -w <<<  "$b")"
i=0
for i in {1.."$c"}
do
    d="$(cut -f"$i" -d" " <<< "$b")"
    echo "$d"
    (( i += 1 ))
done
echo "$count"

1 个答案:

答案 0 :(得分:0)

您的原始代码有一些问题:

  • 如果任何子目录的名称中包含空格,那么您的script2.sh将产生模糊的输出
  • 您永远不会将i添加到count
  • 您的wcforcut是一种复杂的访问目录名称列表的方法
  • 缩进令人困惑

这是一个简单的递归函数,它使用bash内置函数来避免调出外部程序:

#!/bin/bash

countdir()(
    declare -i n=0
    if cd "$1" 1>&2; then
        shopt -s dotglob nullglob
        for f in *; do
            if [ -d "$f" ]; then
                n+=$(countdir "$f") # recurse!
            fi
            n+=1
        done
    else
        printf 1>&2 "Access error, ignoring directory: %s\n" "$1"
    fi
    echo $n
)

countdir "$1"
  • 我们使用f()()而不是更常见的f(){},因此shoptcd是临时的
  • declare -i定位$n并允许直接执行算术
  • 在代码之后,这包括计数中的子目录及其内容
  • 如果存在指向具有多个硬链接的目录或文件的符号链接,则
  • 计数总数可能是错误的
  • 不带参数调用等同于用“。”调用。 (因为cd ""是无操作)