打印目录及其子目录中所有文件的“完整”相对路径列表

打印目录及其子目录中所有文件的“完整”相对路径列表

我需要打印目录及其子目录中所有文件的“完整”相对路径列表。我以前用 du 和 grep 来做这件事:

du -a <path_to_directory> | grep -Po '[0-9]+\t\/\K.*'

但是如果路径太长,du 会用点替换部分路径。

哪一个是好的选择?

解析 ls 不是一个选项

答案1

最直接的选择是find

$ cd /usr/lib; find .
.
./libxcb-icccm.so.4.0.0
./libbz2.so.1.0.6
./libdca.so.0
./libxcb-composite.so
./libyajl.so
./libswscale.so
./libxvidcore.so.4.3
./libjasper.so.1
./libdrm_intel.so.1
...

它有各种过滤测试,例如:

  • -type根据类型进行过滤(常规文件f、目录d等)
  • -mindepth-maxdepth设置find搜索的深度(实际上并不是测试)
  • -name-path根据文件名和路径进行过滤,支持通配符。
  • 以及许多其他测试,例如权限、所有权、时间等。

它提供了多种输出格式,使用-printf选项。


根据 shell 和启用的选项,您还可以使用通配符来实现此目的。例如,在bash

$ shopt -s globstar; printf "%s\n" **
accountsservice
accountsservice/accounts-daemon
aisleriot
aisleriot/ar-cards-renderer
aisleriot/guile
aisleriot/guile/2.0
aisleriot/guile/2.0/accordion.go
aisleriot/guile/2.0/agnes.go
aisleriot/guile/2.0/aisleriot
aisleriot/guile/2.0/aisleriot/api.go
...

并且zsh

$ printf "%s\n" **/*
accountsservice
accountsservice/accounts-daemon
aisleriot
aisleriot/ar-cards-renderer
aisleriot/guile
aisleriot/guile/2.0
aisleriot/guile/2.0/accordion.go
aisleriot/guile/2.0/agnes.go
aisleriot/guile/2.0/aisleriot
aisleriot/guile/2.0/aisleriot/api.go
...

相关内容