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
-printf
GNUの書式指定子は、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 -printf
2回実行しない限り、コマンドは静的幅を使用する必要がありますします。出力が広すぎる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を使用してこのオプションを設定すると、シェルはこれを行います。zsh
bash
shopt -s globstar
zsh
GLOB_DOTS
setopt GLOB_DOTS
bash
shopt -s dotglob
ワイルドカードパターンが長すぎて「パラメータリストが大きすぎます」エラーが生成されるリストに拡張されている場合、この方法は機能しません。
ls -l -R
この出力は、ディレクトリが個別にリストされておらず、ディレクトリ間に区切り文字があるため、通常の出力とは異なります。
答え2
もう一つの簡単な選択肢があります。
$ find example -exec ls -ld {} +