【问题标题】:Extending a received path扩展接收路径
【发布时间】:2019-09-01 23:10:07
【问题描述】:

作为对任何接收目录中的项目进行计数的脚本的一部分,我还需要递归检查任何子目录。 为此,我需要扩展给定的参数并将子目录的路径添加到其中,例如:对于具有子目录 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"

【问题讨论】:

  • find -exec ?

标签: bash shell loops path


【解决方案1】:

您的原始代码存在一些问题:

  • 如果任何子目录的名称中包含空格,那么您的 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 "" 是空操作)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2015-11-15
    • 2020-02-10
    相关资源
    最近更新 更多