Мне нужно напечатать список «полных» относительных путей всех файлов, представленных в каталоге и его подкаталогах. Я делал это с помощью du и grep:
du -a <path_to_directory> | grep -Po '[0-9]+\t\/\K.*'
Но du заменяет часть путей точками, если они слишком длинные.
Что является хорошей альтернативой?
Разбор ls не вариант .
Самая простая опция была бы 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
опция.
В зависимости от оболочки и включенных опций, можно также использовать globbing с этой целью. Например, в 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
...