• Perl/ディレクトリの再帰処理

サイズがゼロのファイルを削除

概要

  • カレントディレクトリからサイズがゼロのファイルを削除する。
  • 「-d」オプションを付けると削除実行、無しだと削除対象のリストアップのみ行う。
  • ドットファイルも対象とする。

ソースコード

  • delSizeZero.zip
    #!/usr/bin/perl
    # カレントディレクトリからサイズゼロのファイルを削除する
    
    use strict;
    use warnings;
    use utf8;
    
    my $progName = 'delSizeZero';
    my $delete = 0;
    
    if ( @ARGV > 0 ){
      if ( $ARGV[0] eq '-d' ){
        $delete = 1;
      } else {
        die("List up files that are size 0.\nusage: $progName [-d]\n  -d: delete them\n");
      }
    }
    
    foreach my $file (sort(glob("{.*,*}"))){
      if ( -f $file && -s $file == 0 ){
        $file =~ m{([^;]+)$};
        my $fileName = $1;
        print "$fileName\n";
        if ( $delete ){
          unlink($file) or die("$progName: $fileName: $!\n");
        }
      }
    }
    
    # EOF

リンク

テキストファイルからXML部分を抜き出し

概要

  • テキストファイルからXML部分を抜き出す。
  • 1ファイルにXMLは1個。
  • 文字コードはEUC。
  • 処理はWindows上で行う。

ソースコード

#!/usr/local/bin/perl

# カレントディレクトリのテキストファイルのリスト
@filelists = <./*.txt>;
# print join( "\n", @filelists );

foreach $fname_in (@filelists){
	$fname_out = $fname_in;
	$fname_out =~ s/\.txt/\.xml/;

	open( IN, $fname_in );
	@lines = < IN >;
	close( IN );
	$body = join( "", @lines );

	# XML部分を正規表現で抜き出す
	# '.' は改行にマッチしないので、代わりに [\x00-\xff] を使う (マルチバイトストリングの場合)
	# unicode だと [\x0000-\xffff] を使う
	if ( $body =~ /^[\x00-\xff]*(\<\?xml [\x00-\xff]*\<\/[^\>]+\>)[\x00-\xff]*$/ ){
		$body = $1 . "\n";
		# CRLF から CR を削除
		# $body =~ tr/\r//d;
		open( OUT, ">" . $fname_out );
		# テキストモードだと自動的に CR が付加されるのでバイナリモードで書き出し
		binmode( OUT );
		print OUT $body;
		close( OUT );
	}
}

#EOF

リンク