web-dev-qa-db-ja.com

ディレクトリおよびそのサブディレクトリに存在するすべてのファイルの「フル」相対パスのリストを出力します

ディレクトリとそのサブディレクトリにあるすべてのファイルの「フル」相対パスのリストを印刷する必要があります。私はこれをduとgrepで行っていました。

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

ただし、duは、パスが長すぎる場合、パスの一部をドットで置き換えます。

どちらが良い選択肢ですか?

lsの解析はオプションではありません

5
kos

最も簡単なオプションは 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オプションを使用して、さまざまな出力形式を提供します。


シェルと有効なオプションによっては、この目的でグロビングを使用することもできます。たとえば、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
muru