プチハマった割にはクソ単純だった。
今後のためにめも。
前提
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読みます。はい。