こんにちは、山田ハヤオです。久しぶりの技術的な記事です。
やりたいこと
ls
でディレクトリの中身を見ようとすると、ディレクトリの更に中って見てくれないじゃないですか。うーん…伝わりにくい。
. ├── dir-1 │ └── file-2 └── file-1
ってあって、ls
を実行してもfile-2
は見えないんです。./
以下の全てのテキストファイルを再帰的に一覧表示しようとしたらかなり苦戦したのでその備忘録です。
シェル芸っぽいやつ
find
コマンドでディレクトリ指定だけすると、ファイルを再帰的に表示してくれます。
でもこのままだと相対パスなのでxargs realpath
で絶対パスにします。
その後、file
コマンドでファイルの種類を取得し、grep
でテキストファイルのみを選びます。cut
で余分な情報を削除して、パスの最後にくっついてる:
をsed
で取り除きます。
テキストファイルのみを取り出す処理でfile
を使っているのを整形するせいで長くなってしまっています。短くする方法があったら教えて下さい。
find ./ 2>/dev/null | xargs realpath | xargs -Ipath file --mime-type path | grep "text/" | cut -d " " -f 1 | sed 's|:*$||g'
応用
現在のディレクトリ下のテキストファイルの行数の総数をカウントする
上のコマンドで一覧を取得した後、xargs cat
で全て開いてwc -l
で行数を数えています。cat
とwc
の間にsed
やgrep
を追加すれば「コメントを除外」とか「空行を削除」というのもできます。
find ./ 2>/dev/null | xargs realpath | xargs -Ipath file --mime-type path | grep "text/" | cut -d " " -f 1 | sed 's|:*$||g' | xargs cat | wc -l
コメント