当我在目录中执行“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中,fish
也tcsh
具有以下功能
答案3
tree
也是一个很好的工具。
我用
tree -Dpushfag --du
您还可以添加深度限制,例如最多 2 个级别:
tree -Dpushfag --du -L 2