Распечатать структуру папки с рекурсивной функцией Shell script - PullRequest
0 голосов
/ 07 мая 2020

Я хочу распечатать структуру папки со сценарием оболочки. Это будет выглядеть так:

File : linux -3.14/COPYING
File : linux -3.14/CREDITS
   Directory : linux -3.14/Documentation
      File : linux -3.14/Documentation/00 - INDEX
      Directory : linux -3.14/Documentation/ABI
         File : linux -3.14/Documentation/ABI/README

, и это мой сценарий. Проблема в том, что он распечатывает все файлы и папки для текущего каталога, но не печатает для вложенных папок. Может быть, я делаю рекурсию неправильно

dirPrint() {
    # Find all files and print them first
    file=$1
    for f in $(ls ${file}); do
        if [ -f ${f} ]; 
            then
                path="$(pwd)/$f"
                echo "File: $path"
        fi
    done

    # Find all directories and print them
    for f in $(ls ${file}); do
        if [ -d ${f} ];
            then
                path="$(pwd)/$f"
                echo "Directory: $path"
                echo "  $(dirPrint "$path")"
        fi
    done
}
if [ $# -eq 0 ]; then
    dirPrint .
else
    dirPrint "$1"
fi

А также в чем разница между использованием $ 1, «$ 1» и «$ {1}»?

1 Ответ

1 голос
/ 07 мая 2020

В вашем скрипте есть различные проблемы. Вы не должны анализировать вывод ls, вместо этого перебирайте раскрытие подстановочного знака. Всегда заключайте переменные в двойные кавычки, чтобы пробелы в именах файлов не нарушали ваши команды.

#! /bin/bash
dir_find () {
    local dir=$1
    local indent=$2
    for f in "$dir"/* ; do
        printf '%s%s\n' "$indent${f##*/}"
        if [[ -d $f ]] ; then
            dir_find "$f" "    $indent"
        fi
    done
}

dir_find .
...