ls -lコマンドの結果をサブディレクトリ含めてフルパスで列挙したい

プチハマった割にはクソ単純だった。
今後のためにめも。

## 前提

```bash
alias ll='ls -l --color=auto'
```
とかそんなんやってること

## やりたいこと

`ll` の結果を、それ以下のサブディレクトリもすべて含めて再帰的に一覧化して取得したい。
ファイル／ディレクトリ名はフルパスで表示されて欲しい。

要は

```text
/hoge
|  |--fuga
|  |  |--bar.txt
|  |  |--foo.txt
|  |  |--piyo
|  |  |  |--baz.txt
```
こういう構成の時、

```shell-session
$ なんかいい感じのコマンド
<なんかllで出てくるパーミッションとかサイズとかの情報> /hoge
<なんかllで出てくるパーミッションとかサイズとかの情報> /hoge/fuga
<なんかllで出てくるパーミッションとかサイズとかの情報> /hoge/fuga/foo.txt
<なんかllで出てくるパーミッションとかサイズとかの情報> /hoge/fuga/bar.txt
<なんかllで出てくるパーミッションとかサイズとかの情報> /hoge/fuga/piyo
<なんかllで出てくるパーミッションとかサイズとかの情報> /hoge/fuga/piyo/baz.txt
```

こういう結果が欲しい。

## 先に結論書いちゃうと

```shell-session
$ ll -d $(find /foo/bar)
$ ll -d $(find `pwd`)
```
とかでいけます。上がディレクトリ指定時で、下はカレントディレクトリ以下を見たい時。
あとは必要に応じて`ll`に`-a`つけるとか、煮るなり焼くなり……

### 2020/07/30 追記
コメントにて @dkaneko2008 さんにご指摘いただきました。ありがとうございます！
対象フォルダ配下のアイテム数が多すぎると、`Argument list too long`のエラーが出るようです。

この場合、対象ディレクトリを絞り込むことで解決できます。
==================== 追記ここまで ====================

これより下はあんまり見ても価値のない、ほぼ自分用に残してるだけな思い出のメモリー。


## クソみたいなトライアンドエラー

### `ll -R`
```shell-session
$ ll -R /hoge
/hoge:
合計 4
drwxr-xr-x 3 root root 4096  5月  1 20:38 2017 fuga

/hoge/fuga:
合計 16
-rw-r--r-- 1 root root 7604  5月  1 20:35 2017 bar.txt
-rw-r--r-- 1 root root  543  5月  1 20:35 2017 foo.txt
drwxr-xr-x 2 root root 4096  5月  1 20:38 2017 piyo

/hoge/fuga/piyo:
合計 4
-rw-r--r-- 1 root root 2634  5月  1 20:35 2017 baz.txt
```
今回の件を調査するに至った原因。
空行やら各サブディレクトリの見出し的なアレやら余計な行が混じってしまってイマイチ。
今回は出力結果をそのまま別作業の入力として使いたいんじゃ


### `du`コマンド
```bash
$ du -a /hoge
4       /hoge/fuga/foo.txt
4       /hoge/fuga/piyo/baz.txt
8       /hoge/fuga/piyo
8       /hoge/fuga/bar.txt
24      /hoge/fuga
28      /hoge
```
一応リストは取れるけどパーミッションや所有者、更新日時等の情報が取れない。残念。
\#というかコマンドの目的違うし

### `find -ls`
```shell-session
$ find /hoge -ls
1574888    4 drwxr-xr-x   3 root     root         4096  5月  1 20:36 /hoge
1574883    4 drwxr-xr-x   3 root     root         4096  5月  1 20:38 /hoge/fuga
1574886    4 -rw-r--r--   1 root     root          543  5月  1 20:35 /hoge/fuga/foo.txt
1574884    4 drwxr-xr-x   2 root     root         4096  5月  1 20:38 /hoge/fuga/piyo
1574885    4 -rw-r--r--   1 root     root         2634  5月  1 20:35 /hoge/fuga/piyo/baz.txt
1574887    8 -rw-r--r--   1 root     root         7604  5月  1 20:35 /hoge/fuga/bar.txt
```
一番理想に近いけど、くそでかいサイズのファイルがあるようなところとかでやると、桁数の関係か区切りがズレてガッタガタ。惜しい。
↑みたいなちっちゃい範囲だったら、これでもいいかも。


## 正解は`ll -d` + `find`でした

`find` の結果を `ll -d` に渡してやればいい。

```shell-session
$ ll -d $(find /hoge)
drwxr-xr-x 3 root root 4096  5月  1 20:36 2017 /hoge
drwxr-xr-x 3 root root 4096  5月  1 20:38 2017 /hoge/fuga
-rw-r--r-- 1 root root 7604  5月  1 20:35 2017 /hoge/fuga/bar.txt
-rw-r--r-- 1 root root  543  5月  1 20:35 2017 /hoge/fuga/foo.txt
drwxr-xr-x 2 root root 4096  5月  1 20:38 2017 /hoge/fuga/piyo
-rw-r--r-- 1 root root 2634  5月  1 20:35 2017 /hoge/fuga/piyo/baz.txt
```

バッククォートの方がタイプ数少なくて楽かな

```bash
$ ll -d `find /hoge`
# 結果は同じなので省略
```


ちなみに`-d`オプションは、manによると……
> -d  ディレクトリの中身を表示せず、他のファイルと同じようにディレクトリ名をリスト表示する。

そうそうこれこｒ


ちなみにファイルのみ／ディレクトリのみの一覧が欲しければ、 `find` で絞ってやればいい。

```bash
$ ll `find /foo/bar -type f`     # ファイルのみ（※）
$ ll -d `find /foo/bar -type d`  # ディレクトリのみ
```

※`-type f`した時はファイルしか抽出されてこないので、`-d`オプションつけなくてもいい。


あと、カレント以下を対象にしたい時にうっかり

```bash
$ ll -d $(find .)
```
とかやると全部相対パスで表示されて残念な感じになるので、

```bash
$ ll -d $(find `pwd`)
```
とかやるといい感じです。


## おまけ

日時の表示フォーマットを変えたい時は `--time-style` オプションを使用。

```bash
$ ll -d --time-style=+%Y/%m/%d\ %H:%M:%S `find /foo/bar`
$ ll -d --time-style=long-iso `find /foo/bar`
```

%うんたら～の書式は、 `date` コマンドと同様でいいらしい。
ただその場合、`=`の後ろに`+`をつけないとエラーになってしまう。

この原因は今のところよくわかってない。そういうもんなんだなーってレベルの理解度。
man読みます。はい。


## 参考にさせていただきました
[ls -l コマンドで年を表示したり、ファイルの日付の表示形式を変えるには。](http://takuya-1st.hatenablog.jp/entry/2014/05/07/014251)