Bashでディレクトリ下のテキストファイルを再帰的に取得する

小技

こんにちは、山田ハヤオです。久しぶりの技術的な記事です。

スポンサーリンク

やりたいこと

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で行数を数えています。
catwcの間にsedgrepを追加すれば「コメントを除外」とか「空行を削除」というのもできます。

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

コメント

タイトルとURLをコピーしました