递归使用 ls 而不使用 -R

递归使用 ls 而不使用 -R

我正在尝试编写一个 shell 脚本,其输出类似于ls -R不使用选项-R

这是编程作业的一部分,禁止我使用-R,finddu。我需要确定整个主目录中的前 5 个文件/目录,并说明总共有多少个目录和文件。

我知道我可以用来 {sort -n | tail -n}获取前 5 个文件,但我无法弄清楚如何在不使用选项的情况下递归地获取所有文件和目录的未过滤列表-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 "/.*/.*/.*/"

这些只是假设您家里没有无数的文件!如果这样做,您将收到参数列表太长的错误。但是,对于任何一步给出答案的解决方案,您都可能会遇到类似的错误。 (也是递归函数调用)。

相关内容