Help us understand the problem. What is going on with this article?

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

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

前提

alias ll='ls -l --color=auto'

とかそんなんやってること

やりたいこと

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

要は

/hoge
|  |--fuga
|  |  |--bar.txt
|  |  |--foo.txt
|  |  |--piyo
|  |  |  |--baz.txt

こういう構成の時、

$ なんかいい感じのコマンド
<なんか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

こういう結果が欲しい。

先に結論書いちゃうと

$ ll -d $(find /foo/bar)
$ ll -d $(find `pwd`)

とかでいけます。上がディレクトリ指定時で、下はカレントディレクトリ以下を見たい時。
あとは必要に応じてll-aつけるとか、煮るなり焼くなり……

2020/07/30 追記

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

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

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

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

ll -R

$ 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コマンド

$ 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

$ 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 に渡してやればいい。

$ 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

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

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

ちなみに-dオプションは、manによると……

-d ディレクトリの中身を表示せず、他のファイルと同じようにディレクトリ名をリスト表示する。

そうそうこれこr

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

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

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

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

$ ll -d $(find .)

とかやると全部相対パスで表示されて残念な感じになるので、

$ ll -d $(find `pwd`)

とかやるといい感じです。

おまけ

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

$ 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 コマンドで年を表示したり、ファイルの日付の表示形式を変えるには。

dwatarub
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away