2010-05-13 6 views
1

j'ai un répertoire qui contient plusieurs répertoires comme suit:Linux - Vous voulez vérifier pour les répertoires en double possibles (probablement regex nécessaire)

/Musique/
/Musique/JoeBlogs-Back_In_Black 1980
/Musique/JoeBlogs-Back_In_Black- (Remastered) -2003
/Musique/JoeBlogs-Back_In_Black- (réédition) -1987
/Musique/JoeBlogs-Thunder_Man-1947

Je veux un script pour passer et me dire quand il y a doublons 'possibles', dans l'exemple ci-dessus ld ramasser les doublons suivants que possible de la liste des répertoires:

/Musique/JoeBlogs-Back_In_Black 1980
/Musique/JoeBlogs-Back_In_Black- (Remastered) -2003
/Musique/JoeBlogs-Back_In_Black- (Réédition) -1987

1) Est-ce possible?
2) Si oui, merci de nous aider!

+1

Vous dites que vous avez plusieurs répertoires, mais vous avez montré seulement 1 répertoire. À quoi ressemblent les autres répertoires? Le deuxième champ de texte entre les tirets 'JoeBlogs-Back_In_Black-1980' est-il toujours le nom de la chanson? – dawg

Répondre

0

Si vos noms de répertoires suivent une structure régulière telle que:

foo-Name_of_Interest-bar 

alors vous pouvez faire un simple regex pour dépouiller le « foo- » et le « -bar » et faire une comparaison directe.

Si ce n'est pas possible, vous devrez faire un algorithme de correspondance de motif beaucoup plus cher. Peut-être quelque chose comme longest common sequence ou Levenshtein distance. Il peut y avoir d'autres techniques qui sont plus appropriées.

correspondant simple à Bash (version 3.2 ou supérieure) pourrait ressembler à cet extrait:

dir='/Music/JoeBlogs-Back_In_Black-(Remastered)-2003' 
regex='^([^-]*)-([^-]*)-(.*)$' 
if [[ ${BASH_REMATCH[1]} == ${prev_dir[1]} && # "/Music/JoeBlogs" 
     ${BASH_REMATCH[2]} == ${prev_dir[2]} ]] # "Back_In_Black" 
then 
    echo "we have a match" 
fi 

Cet extrait ne montre pas une boucle find ... | while read ... ou comment les entrées précédentes et les listes de correspondances pourraient être traitées.

2

Suivi:

Je l'ai fait ce que je besoin de l'aide en codant le script Perl suivant. Ceci est mon premier script Perl (et j'ai dû apprendre Perl pour l'écrire - alors ne soyez pas trop dur avec moi :)

#!/usr/bin/perl 

# README 
# 
# Checks a folder for Albums that are similar 
# eg : 
# Arist-Back_In_Black-(Remastered)-2001-XXX 
# Artist-Back_In_Black-(Reissue)-2000-YYY 
# 
# Script prompts you for which one to "zz" (putting zz in front of the file name you can delete it later) 
# 
# CONFIG 
# 
# Put your mp3 directory path in the $mp3dirpath variable 
# 

$mp3dirpath = '/data/downloads/MP3'; 

# END CONFIG 


@txt= qx{ls $mp3dirpath}; 


sort (@txt); 

$re1='.*?'; 
$re2='(?:[a-z][a-z0-9_]*)'; 
$re3='.*?'; 
$re4='((?:[a-z][a-z0-9_]*))'; 

$re=$re1.$re2.$re3.$re4; 

$foreach_count_before=0; #Setups up counter 
$foreach_count_after=1; #Setups up counter 


$number_in_arry = scalar (@txt); 

while ($foreach_count_before < $number_in_arry) { 
             if ($txt[$foreach_count_before] =~ m/$re/is) 
              { 
              $var1=$1; 
              } 
             if ($txt[$foreach_count_after] =~ m/$re/is) 
              { 
              $var2=$1; 
              } 
             if ($var1 eq $var2) 
              { 
              print "-------------------------------------\n"; 
              print "$txt[$foreach_count_before] \n"; 
              print "MATCHES \n"; 
              print "\n$txt[$foreach_count_after] \n"; 
              print "Which Should I Remove? \n"; 
              print "[1] $txt[$foreach_count_before]\n"; 
              print "[2] $txt[$foreach_count_after]\n"; 
              print "[Any Other Key] Take No Action\n\n"; 

              $answer = <>;  # Get user input, assign it to the variable 
               if ($answer == "1") { 
                 print "ZZing $txt[$foreach_count_before]"; 
                 $originalfilename = $mp3dirpath . '/' . $txt[$foreach_count_before]; 
                 $newfilename = $mp3dirpath . '/' . 'zz' . $txt[$foreach_count_before]; 
                 $originalfilename = trim($originalfilename); 
                 $newfilename = trim($newfilename); 
                 qx(mv $originalfilename $newfilename); 
               } 
               elsif ($answer == "2") { 
                 print "ZZing $txt[$foreach_count_after]"; 
                 $originalfilename = $mp3dirpath . '/' . $txt[$foreach_count_after]; 
                 $newfilename = $mp3dirpath . '/' . 'zz' . $txt[$foreach_count_after]; 
                 $originalfilename = trim($originalfilename); 
                 $newfilename = trim($newfilename); 
                 print "mv $originalfilename $newfilename"; 
                 qx(mv $originalfilename $newfilename); 
               } 
               else { 
                 print "Taking No Action"; 
               } 

              } 

              $foreach_count_before++; 
              $foreach_count_after++; 

             } 

# SubRoutine For Trimming White Space from variables 
sub trim($) 
{ 
my $string = shift; 
$string =~ s/^\s+//; 
$string =~ s/\s+$//; 
return $string; 
} 
Questions connexes