« 男二人組にナンパされた件 | メイン | キルドレはボウリングが上手い »

2008年8月 8日

コマンドプロンプトのdirが使えないからlsを作ったよ!

よくあるネタ。でも、ls.batを作ってどうのって話ではございません。そもそも、コマンドプロンプトのdirって、出力が過保護かつ冗長すぎてむかつくわけですよ。なので、dirの出力結果を受け取って、整形しなおしてプリントするperlスクリプトを書いた。やっつけですが。

#!/usr/bin/perl
use strict;
use warnings;
	
my $CHARS_PER_LINE = 75;
my $options = "";
my $dir = "";
	
for(@ARGV){
	if(/^-/){
		$options .= $_;
	}else{
		$dir = " \"".$_."\"";
	}
}
$options =~ s/-//g;
	
my $str = `dir$dir`;
my @files = split("\n",$str);
@files = @files[5..$#files-2];
unless(@files){ exit; }
	
if($options =~ "l"){
	print join "\n",@files;
}else{
	my @fileNames;
	my $maxlen = 1;
	for(@files){
		unless(/\.\.?$/){
			my @tmp;
			@tmp = split(/ +/,$_);
			$tmp[3] = join " ",@tmp[3..$#tmp];
			if($tmp[2] eq "<DIR>"){
				$tmp[3] = $tmp[3]."/";
			}
			$maxlen = length($tmp[3]) > $maxlen ? length($tmp[3]) : $maxlen;
			push @fileNames,$tmp[3];
		}
	}
	$maxlen += 2;
	if($maxlen > $CHARS_PER_LINE){
		print join "\n",@fileNames;
	}else{
		my $colums = int($CHARS_PER_LINE / $maxlen);
		my $i = 0;
		for(@fileNames){
			printf("%-${maxlen}s",$_);
			if(++$i % $colums == 0){
				print "\n";
			}
		}
	}
}

ダウンロード:ls.pl

PATHの通ったフォルダにこのファイルを突っ込んで、PATHEXTに.plを追加すれば、コマンドでlsが使えるようになる。出力結果はこんな感じ。

C:\Perl>ls
bin/   cpan/  eg/    etc/   html/  lib/   man/   site/

これで、適当にカラム数を設定して、整列してくれるようになりました。フォルダだったら最後に「/」を付けてくれる。

引数は、ハイフンで始まっているかどうかで、オプションか否かを判断していますが、もしハイフン始まりのフォルダ名が引数に指定されたら、うまく動きません。渡された引数がクオートされてるかどうかを判断する方法がわからんので。まあ、そんなフォルダ名は付けるなってことですよ。

あとは、複数フォルダを引数に指定した場合も全てのフォルダ内のファイルがうまく表示されませんが、別にそんな機能いらなくね、という。

オプションの対応はとりあえず「-l」だけ。まあ、個人で使う分には十分です。

投稿者 Songmu : 2008年8月 8日 23:42