"ls -l"スタイルリストの列を並べ替えるには、検索を使用します。

ls -lを使用するときに得られるリストと同じ形式を取得しようとしていますfind。最後はファイル名ではなくフルパス名ですが。 FWIW 私find (GNU findutils) 4.5.11

フラグが見つかりました-ls。大丈夫ですが、列の間にはるかに多くの間隔があり、便利ではありませls -lん。特に、最後にフルパス名を使用すると、結果を2行にプッシュして読み取りが困難になる可能性があるためです。たとえば...

$ find /example -ls
  7439    4 -rwxrwxr-x   1 example    example        1579 Oct 26  1985 /path/to/first/file/that/was/found
   530    4 -rwxrwxr-x   1 example    example         122 Oct 26  1985 /path/to/second/file/that/was/found

だからこれが完了している間、私はそれをよりよくしたいと思います。-printf旗を見るとfind同じ目的を達成したようです。これまで私は-printf '%M %u %g %p\n'素晴らしい情報を持っており、必要な情報をカスタマイズし、ここに他の情報を追加できます。しかし...

問題は列をソートする方法です。

このアプローチは、ユーザー名とグループ名の長さが異なる場合はあまり効果的ではありません。たとえば...

$ find /example -printf '%M %u %g %p\n'
-rwxr-xr-x root root /path/to/first/example/file
-rwxr-xr-x example example /path/to/second/example/file

この問題をどのように解決できますか?ただ使用するのが一番良いのですがfind、これができない場合は別のものとして配管することをお勧めします。マニュアルページでは、findこのオプションをまったく使用していないようです-printf

ベストアンサー1

-printfGNUの書式指定子は、C関数findと同様に、幅や並べ替えなどの修飾子を使用します。printf()つまり、データを左右に​​並べ替えることができ、現在のプロジェクトで特定の幅を決定的に割り当てることができます。

基本出力:

$ find . -printf '%M %u %g %p\n'
drwxr-xr-x kk wheel .
-rw-r--r-- kk wheel ./.zshrc
-rw-r--r-- kk wheel ./file
drwxr-xr-x root wheel ./rootstuff
-rw-r--r-- root wheel ./rootstuff/SECRET
-rw------- kk wheel ./.viminfo

ユーザー列とグループ列の幅(6)を指定します(右揃え)。

$ find . -printf '%M %6u %6g %p\n'
drwxr-xr-x     kk  wheel .
-rw-r--r--     kk  wheel ./.zshrc
-rw-r--r--     kk  wheel ./file
drwxr-xr-x   root  wheel ./rootstuff
-rw-r--r--   root  wheel ./rootstuff/SECRET
-rw-------     kk  wheel ./.viminfo

同じですが、左揃え:

$ find . -printf '%M %-6u %-6g %p\n'
drwxr-xr-x kk     wheel  .
-rw-r--r-- kk     wheel  ./.zshrc
-rw-r--r-- kk     wheel  ./file
drwxr-xr-x root   wheel  ./rootstuff
-rw-r--r-- root   wheel  ./rootstuff/SECRET
-rw------- kk     wheel  ./.viminfo

ファイルサイズはバイト単位で、5桁の数字が割り当てられます(実行方法を示すためにゼロで埋められます)。

$ find . -printf '%M %-6u %-6g %05s %p\n'
drwxr-xr-x kk     wheel  00512 .
-rw-r--r-- kk     wheel  00000 ./.zshrc
-rw-r--r-- kk     wheel  00095 ./file
drwxr-xr-x root   wheel  00512 ./rootstuff
-rw-r--r-- root   wheel  00000 ./rootstuff/SECRET
-rw------- kk     wheel  00922 ./.viminfo

コマンドはls実際の必要に応じて列に幅を動的に割り当てる可能性が高いですが、各列に必要なスペースを最初に計算してから、実際に出力形式を指定するためにコマンドをfind -printf2回実行しない限り、コマンドは静的幅を使用する必要がありますします。出力が広すぎるfind理由find -lsは、2段階のアプローチを使用せずに各列に十分なスペースを提供し、すべてがうまく整列していることを願っています。


もちろん、何千ものファイルがなく、ただすべてをリストしたい、再帰的に(つまり、内のパス名をフィルタリングしたり他の操作を実行する必要はありませんfind)、次のようになりますls

$ ls -d -l **/*
-rw-------  1 kk    wheel  922 Jul 25 23:46 .viminfo
-rw-r--r--  1 kk    wheel    0 Jul 19 23:39 .zshrc
-rw-r--r--  1 kk    wheel   95 Jul 25 23:51 file
drwxr-xr-x  2 root  wheel  512 Jul 26 00:00 rootstuff
-rw-r--r--  1 root  wheel    0 Jul 26 00:00 rootstuff/SECRET

これは、使用する場合、デフォルトではシェル**内の利用可能なワイルドカードパターンに依存します。また、隠された名前と一致するシェルにも依存します。 andを使用してこのオプションを設定すると、シェルはこれを行います。zshbashshopt -s globstarzshGLOB_DOTSsetopt GLOB_DOTSbashshopt -s dotglob

ワイルドカードパターンが長すぎて「パラメータリストが大きすぎます」エラーが生成されるリストに拡張されている場合、この方法は機能しません。

ls -l -Rこの出力は、ディレクトリが個別にリストされておらず、ディレクトリ間に区切り文字があるため、通常の出力とは異なります。

おすすめ記事