-Rなしでlsを再帰的に使用する

-Rなしでlsを再帰的に使用する

ls -Roptionsを使わずに同様の出力を持つシェルスクリプトを作成しようとしています-R

-Rこれはプログラミングの課題の一部なので、find使用できませんdu。ホームディレクトリ全体で上位5つのファイル/ディレクトリを識別し、ディレクトリ全体とファイル数を表示する必要があります。

最初の5つのファイルをインポートするために使用できることを知っていますが、 {sort -n | tail -n}optionsを使用せずにフィルタリングされていないすべてのファイルとディレクトリのリストを繰り返しインポートする方法はわかりません-R

答え1

再帰を実行するコマンドに頼るのではなく、再帰スクリプトを直接作成する必要があるように聞こえます。

これがそのような機能のスケルトンです。あなたが埋めるように空の部分を残しました。

listAllFiles() {
    local dir=$1
    local file

    for file in "$dir"/*; do
        if <$file is a directory>; then
            listAllFiles "$file"
        else
            <print $file>
        fi
    done
}

高レベルでは、関数はディレクトリを最初の引数として使用します。そのディレクトリの内容を繰り返します。サブディレクトリが見つかったら、自分自身を呼び出します。それ以外の場合は、見つかった内容を印刷します。これは最終的にディレクトリ構造を通して繰り返される。

ls -Rまたは、他の組み込みコマンドを使用するのと同じように、この機能を使用できますfind。結果を変数に保存できます。

allFilesInCurrentDirectory=$(listAllFiles .)

またはパイプラインで使用できます。

listAllFiles ~/ | cmd1 | cmd2

答え2

bashを明示的に指定していないので、非常に簡単なzshソリューションを自由に提供できます。

ls -d ~/**/*| egrep -v "/.*/.*/.*/"

ドットファイルも含めるには:

ls -d ~/**/*(D)| egrep -v "/.*/.*/.*/"

これは家に多数のファイルがないと仮定するだけです!これにより、引数リストが長すぎるというエラーが発生します。ただし、1つのステップで答えを提供するソリューションでは、同様のエラーが発生する可能性があります。 (また、再帰関数を呼び出す)。

関連情報