递归“ls”给出绝对文件名

递归“ls”给出绝对文件名

当我在目录中执行“ls -R”时,我得到类似的信息

./dir1
dir2 file1.txt file2.txt

./dir1/dir2
file3.txt file4.txt

但我想要一个命令给我

./dir1/file1.txt
./dir1/file2.txt
./dir1/dir2/file3.txt
./dir1/dir2/file4.txt

这样我就可以在 for 循环中使用它来处理所有文件。

答案1

你要find(1) 这将完全符合您的要求。您还可以指定各种过滤条件,例如文件类型(不包括目录)、比给定文件的时间戳更新等。手册页将更详细地描述这些条件。

另外,看看这个-exec选项;您也许可以使用它而不是迭代输出。

答案2

如果您使用 bash ≥4 或 zsh 或 ksh93 ≥o+ 1,则可以使 shell 进行递归通配符:**/通配符匹配任意深度的目录。在 bash 中,您需要使用shopt -s globstar(bash) 启用该功能,并注意 bash 4.2 及之前**/版本会遍历目录的符号链接。在 ksh93 中,您需要set -o globstar(ksh93);在 zsh 中,它始终处于启用状态。

for x in **/*.txt; do …

如果您需要将脚本移植到其他 shell,使用find命令,这正是完成这项工作的正确工具。请注意,这find是一个可以以两种方式工作的外部命令:它可以生成文件列表,并且可以为每个文件执行命令。如果要对每个文件执行命令,请使用-exec

find . -type f -name '*.txt' -exec chmod a+r {} +

1在非Bourne shell中,fishtcsh具有以下功能

答案3

tree也是一个很好的工具。

我用

tree -Dpushfag --du

您还可以添加深度限制,例如最多 2 个级别:

tree -Dpushfag --du -L 2

相关内容