我需要打印目录及其子目录中所有文件的“完整”相对路径列表。我以前用 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
...