#!/usr/bin/perl # iPod Shuffle に刺激を受けて作成 # ストレージ型のPlayerの内容を、ランダムに入れ換える。 use Getopt::Std ; use File::Find ; use File::Copy ; $rem = $add = -1 ; $verb = 1 ; $doit = 1 ; # 入れ換える曲数( +N 追加 , -N 削除 , N 追加削除 ) for( ; @ARGV > 0 ; shift( @ARGV ) ) { if ( $ARGV[0] =~ /^\+(\d+)$/ ) { $add = $1 ; } elsif ( $ARGV[0] =~ /^-(\d+)$/ ) { $rem = $1 ; } elsif ( $ARGV[0] =~ /^(\d+)$/ ) { $add = $rem = $1 ; } elsif ( $ARGV[0] =~ /^(-|\+)v$/ ) { $verb = ($1 eq "-") ; } elsif ( $ARGV[0] =~ /^(-|\+)n$/ ) { $doit = ($1 eq "+") ; } else { last ; } } if ( $rem < 0 && $add < 0 ) { $rem = $add = 10 ; } else { $rem = 0 if ( $rem < 0 ) ; $add = 0 if ( $add < 0 ) ; } $src = shift( @ARGV ) if ( @ARGV > 0 ) ; $dst = shift( @ARGV ) if ( @ARGV > 0 ) ; $dst =~ s/\/$// ; $src =~ s/\/$// ; if ( $dst eq "" || $src eq "" ) { usage() ; exit(1) ; } sub usage() { print "Usage $0 [+N|-N|N] dst src\n" ; } # ファイルを検索する時のコールバック関数 sub filter { if ( -f $_ ) { push( @file , $File::Find::name ) ; } } # 指定ディレクトリ内のすべてのファイルを探す sub file_find { local( $dir ) = @_ ; @file = () ; find( \&filter , $dir ) ; for( $i = 0 ; $i < @file ; $i++ ) { $file[ $i ] =~ s#^$dir/## ; } return @file ; } # @dst = file_find( $dst ) if ( -d $dst ) ; @src = file_find( $src ) if ( -d $src ) ; # コピー対象からplaylistを除外 foreach $file ( @dst ) { @src = grep( !/^$file$/ , @src ) ; } @remlist = () ; for( $i = 0 ; $i < $rem && @dst > 0 ; $i++ ) { push( @remlist , splice( @dst , int( rand( 0+@dst ) ) , 1 ) ) ; } @addlist = () ; for( $i = 0 ; $i < $add && @src > 0 ; $i++ ) { push( @addlist , splice( @src , int( rand( 0+@src ) ) , 1 ) ) ; } # コピー元からファイルを消す foreach $r ( @remlist ) { while( $r ne "" ) { if ( -f "$dst/$r" ) { print "rm \"$dst/$r\"\n" if ( $verb ) ; unlink( "$dst/$r" ) if ( $doit ) ; } elsif ( -d "$dst/$r" ) { rmdir( "$dst/$r" ) if ( $doit ) ; } if ( $r =~ /\// ) { $r =~ s/\/[^\/]+$// ; } else { $r = "" ; } } } # コピー元のファイルを、コピーする foreach $a ( @addlist ) { # コピー先に必要に応じてディレクトリを作る @p = split( /\// , $a ) ; pop( @p ) ; $path = "" ; foreach $p ( @p ) { $path .= "/$p" ; if ( ! -d "$dst$path" ) { print "mkdir \"$dst$path\"\n" if ( $verb ) ; mkdir( "$dst$path" ) if ( $doit ) ; } } # コピー処理 print "cp \"$src/$a\" \"$dst/$a\"\n" if ( $verb ) ; copy( "$src/$a" , "$dst/$a" ) if ( $doit ) ; } if ( $rem > 1 || $add > 0 ) { print "Sync now!\n" if ( $verb ) ; `/bin/sync` }