如何在 bash/shell 脚本中实现树命令?

问题描述 投票:0回答:3

我尝试在 bash 中实现一些代码,其输出类似于终端中的“树”命令。

这里是:

listContent() {
    local file
    for file in "$1"/*; do
        if [ -d $file ]; then
            countSpaces $file
            echo $?"Directory: $file"
            listContent "$file"
        elif [ -f $file ]; then
            countSpaces $file
            echo $?"File: $file"
        fi
    done
}

countSpaces() {
    local space="   "
    for (( i=0; i<${#$1}; i++ )); do
        if [ ${file:$i:1} = "/" ]; then
        space = space + space
        return space
    done
}

listContent "$1"

运行我给的脚本:./scriptName.sh directoryName 其中 scriptName 是我的脚本,directoryName 是参数,它是代码应该从中开始的目录的名称。

我想看到这样的输出:

Directory: Bash/Test1Dir
    File: Bash/Test1Dir/Test1Doc.txt
Directory: Bash/Test2Dir
    Directory: Bash/Test2Dir/InsideTest2DirDir
        File: Bash/Test2Dir/insideTest2DirDoc.txt
File: Bash/test.sh

但是我在完成这段代码时遇到了一些麻烦。有人可以帮我弄清楚为什么它不起作用以及我应该更改什么吗?

将不胜感激。

linux bash shell
3个回答
4
投票

正确有效的实施可能如下所示:

listContent() {
  local dir=${1:-.} whitespacePrefix=$2 file
  for file in "$dir"/*; do
    [ -e "$file" ] || [ -L "$file" ] || continue
    if [ -d "$file" ]; then
      printf '%sDirectory %q\n' "$whitespacePrefix" "${file##*/}"
      listContent "$file" "${whitespacePrefix}    "
    else
      printf '%sFile %q\n' "$whitespacePrefix" "${file##*/}"
    fi
  done
}

注:

  • 我们不计算空格,而是使用调用堆栈来跟踪空格的数量,在每次递归调用时追加。这避免了需要计算每个名字中
    /
    的数量。
  • 我们引用 all 参数扩展,除了在有限数量的上下文之一中隐含地避免了字符串拆分和 glob 扩展。
  • 我们避免尝试将
    $?
    用于跟踪数字退出状态的预期目的以外的任何用途。
  • 只要出现不受控制的数据(例如文件名),我们就使用
    printf %q
    ,以确保即使是恶意名称(包含换行符、光标控制字符等)也能被明确打印。

0
投票

如果你想要一个没有

Directory
File
领导者的视觉表示,那么下面是一个简单的单行代码(包装在一个 shell 函数中)。

treef() (
    [ -d "$1" ] && { dir="$1"; shift; } || dir='.'
    find "$dir" "$@" | sed -e 's@/@|@g;s/^\.|//;s/[^|][^|]*|/ |/g;/^[. |]*$/d'
)

0
投票

我认为 https://github.com/s0ubhik/tree/ 是您正在寻找的,它是用 bash 编写的单个脚本,看起来与 tree 命令一模一样。 see here

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.