カレントディレクトリのファイルの中身をざらっとcatする

プログラミングの練習問題的に少し考えてみた。

catを使うのでシェルスクリプトでサラッと書ければよいのだろうけど、大変そうなのでいつものようにPerlのお力を借り・・

*実行の様子は最後に入れます。

Perlのコードのはこのような感じで。

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';

my $arg = $ARGV[0] // '';
my @files;

if ($arg =~ /-[al]/) {
    @files = glob "* .*"; # 不可視ファイルも対象
    if ($arg eq '-l') {
        for (@files) {
            say $_ if -f; # ファイル一覧だけ表示
        }
        exit;
    }
}
else {
    @files = glob "*"; # 不可視ファイル外す
}

my %cats;
for (@files) {
    $cats{$_} = `cat $_` if -f;
}

say for (sort keys %cats);
say "===\n";

for (sort keys %cats) {
    say $_;
    say '---';
    say $cats{$_};
}

しかしこれだけだと、ターミナルに出力するだけで、行数が多いときに不便なのでlessで出すようにしたい。ということでPerlだけでは済まず、.bashrcに以下みたいなのを書く。

# .bashrcに入れる。パスは環境に応じて。
# 当該ファイルは cats.pl とする。

function cats {
    local arg="$1"
    perl path/to/cats.pl $arg | less
}

で、結果はこんな感じ。

gyazo.com

コマンド名catsを入れると、カレントディレクトリ内のファイルを全部対象にしてcatしていく。

最初にファイル名が列記されて、それに各ファイ名+中身が続いていく感じ。

オプションで -a を入れると不可視ファイルも対象にする。

lessを使わなければ、bashrcでは関数にしなくてもエイリアスだけで行けるんだけど、自分的にはlessは必須なので・・という感じ。

この機能は以前からたびたび欲しいと思っていたので、今後少しでも快適になればよいのだけど。

*別環境でも使えるようにGitHubにも上げておきました。
GitHub - note103/cats