0

私の課題は、ユーザーにディレクトリの名前を尋ねる Unix シェル スクリプトを作成することですfind

これが私がこれまでに持っているものです:

#!/bin/bash
dir_lister()
{
    cd "$1"
    echo "$1"
    list=$(ls -l ${1})


    nolines=$(echo "$list" | awk 'END{printf "%d",NF}')

    if [ $nolines -eq 2 ]
    then

        echo "$1"

        return
    fi

    filelist=$(echo "$list" | grep ^-.*)
    dirlist=$(echo "$list" | grep ^d.*)

    filename=$(echo "$filelist"| awk '{printf "%s\n",$NF}')
    present=$(pwd)
    echo "$filename"| awk -v pres=$present '{printf "%s/%s\n",pres,$0}'

    dirlist2=$(echo "$dirlist" | awk '{printf "%s\n",$NF}')

    echo "$dirlist2" | while IFS= read -r line;
    do
        nextCall=$(echo "$present/$line");
        dir_lister $nextCall;
        cd ".."
    done
    cd ".."
}



read -p "Enter the name of the direcotry: " dName

dir_lister $dName 

問題は、3 つのディレクトリの深さの後で、このスクリプトが無限ループに入ってしまうことです。その理由はわかりません。

編集:

あなたの答えを見て思いついたコードは次のとおりです。それでも、ディレクトリの深さは1つしかありません。

#!/bin/bash

shopt -s dotglob # don't miss "hidden files"
shopt -s nullglob # don't fail on empty directories


list_directory()
{
    cd "$2"
    cd "$1"
    ##echo -e "I am called \t $1 \t $2"
    for fileName in "$1/"* 
    do
        ##echo -e "hello \t $fileName"
        if [ -d "$fileName" ];
        then
            echo "$fileName"
            list_directory $fileName $2

        else
            echo "$fileName"
        fi
    done

}
read -p "Enter the direcotory Name: " dirName
var=$(pwd)
list_directory $dirName $var
4

1 に答える 1

2

わかりました、ディレクトリ内のファイルを一覧表示する方法は完全に間違っています ( ParsingLsを参照)。部品をお渡ししますので、それらを組み合わせてスクリプトを作成できるはずです。

これをスクリプトの先頭に置きます。

shopt -s dotglob # don't miss "hidden files"
shopt -s nullglob # don't fail on empty directories

次に、次のコマンドを使用して、ディレクトリの内容を簡単にループできます。

for file in "$directory/"* ; do
   #...
done

ディレクトリがあるかどうかをテストします。

if [ -d "$file" ] ; then
   # "$file" is a directory, recurse...
fi
于 2012-08-10T21:07:06.960 に答える