ls -R
optionsを使わずに同様の出力を持つシェルスクリプトを作成しようとしています-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つのステップで答えを提供するソリューションでは、同様のエラーが発生する可能性があります。 (また、再帰関数を呼び出す)。