Распечатать список & ldquo; full & rdquo; относительные пути всех файлов, представленных в каталоге и в его подкаталогах

Мне нужно напечатать список «полных» относительных путей всех файлов, представленных в каталоге и его подкаталогах. Я делал это с помощью du и grep:

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

Но du заменяет часть путей точками, если они слишком длинные.

Что является хорошей альтернативой?

Разбор ls не вариант .

5
задан 25 March 2015 в 01:46

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 опция.


В зависимости от оболочки и включенных опций, можно также использовать 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
...
9
ответ дан 25 March 2015 в 01:46

Другие вопросы по тегам:

Похожие вопросы: