Commande pour séparer les fichiers selon la première lettre

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Novembre 2nd, 2009, 1:47 pm

En gros j'ai un dossier avec des milliers de fichiers qu'il contient et je tiens à séparer ces fichiers dans des dossiers. Je pourrais passer et de faire ceci ~ 26 fois,

BASH Code: [ Select ]
mkdir _a
mv a* _a/
mv _a/ a/
  1. mkdir _a
  2. mv a* _a/
  3. mv _a/ a/


Même si je rappelle les dernières commandes que j'ai utilisées pour chaque lettre de sa bien encore un tracas.

Il serait agréable d'avoir un script bash que je pourrais appeler quelque chose comme ceci à la place,

BASH Code: [ Select ]
segregate /path/to/directory
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Novembre 2nd, 2009, 1:47 pm

  • kc0tma
  • o|||||||o
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Juil 20, 2007
  • Messages: 3318
  • Loc: Trout Creek, MT
  • Status: Offline

Message Novembre 2nd, 2009, 2:51 pm

Vous pourriez faire un script perl pour faire une réalité. Just a guess quickie bruts:

PERL Code: [ Select ]
my @alphabet = "a".."z";
 
foreach (@alphabet) {
  my $tmpdir = "_" . $_;
  my $folder = $_;
  my $md = "mkdir " . $_;
  my $copyfile = "mv " . $_ . "*";
  my $copyfolder = "mv " . $tmpdir . " " . $folder;
 
  system($md);
  system($copyfile);
  system($copyfolder);
}
 
  1. my @alphabet = "a".."z";
  2.  
  3. foreach (@alphabet) {
  4.   my $tmpdir = "_" . $_;
  5.   my $folder = $_;
  6.   my $md = "mkdir " . $_;
  7.   my $copyfile = "mv " . $_ . "*";
  8.   my $copyfolder = "mv " . $tmpdir . " " . $folder;
  9.  
  10.   system($md);
  11.   system($copyfile);
  12.   system($copyfolder);
  13. }
  14.  


Faites-les simplement ce script exécutable et coller dans votre répertoire / usr / local / bin et lancez-le. Le code ressemble à un chien mâché et je n'ai pas testé ni rien, j'ai à peu près juste qu'il a pété Out. Mais vous avez l'idée de base que j'ai l'espoir.
Like Mr Spork, I also write about my interest in alcoholic beverages.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Novembre 2nd, 2009, 3:04 pm

Ouais presque Ive got a quickie écrit en PHP, mais si theres déjà un script de ce genre, il serait génial. :D

/ / edit - Im Maintenant que c'est fait, heres ce que j'ai utilisés.

PHP Code: [ Select ]
if($argc < 2)
{
   echo "USAGE: ./segregate directory1[, directory2, directoryN...]\n";
}
 
$switches      = array();
$directories   = array();
$subs       = 'abcdefghijklmnopqrstuvwxyz';
$subs_mask     = strtoupper($subs) . "{$subs}1234567890";
 
for($i = 1; $i < $argc; $i++)
{
   if($argv[$i][0] == '-')
   {
      $switches[] =& $argv[$i];
   }
   else
   {
      $directories[] =& $argv[$i];
   }
}
 
// TODO switches/options
 
foreach($directories as $dir)
{
   if(is_dir($dir))
   {
      for($i = 0; $i < 26; $i++)
      {
         mkdir("$dir/{$subs[$i]}");
      }
      mkdir("$dir/0-9");
      mkdir("$dir/misc");
     
      $dh  = opendir($dir);
      while (false !== ($f = readdir($dh)))
      {
         if(strspn($f, $subs_mask))
         {
            $d = strspn($f[0], '1234567890') ? '0-9' : strtolower($f[0]);
            if(is_file("$dir/$f") || (is_dir("$dir/$f") && strlen($f) > 1 && $f != '0-9' && $f != 'misc'))
            {
               rename("$dir/$f", "$dir/$d/$f");
            }
         }
         else if($f != '.' && $f != '..')
         {
            rename("$dir/$f", "$dir/misc/$f");
         }
      }
      closedir($dh);
   }
   unset($files);
}
  1. if($argc < 2)
  2. {
  3.    echo "USAGE: ./segregate directory1[, directory2, directoryN...]\n";
  4. }
  5.  
  6. $switches      = array();
  7. $directories   = array();
  8. $subs       = 'abcdefghijklmnopqrstuvwxyz';
  9. $subs_mask     = strtoupper($subs) . "{$subs}1234567890";
  10.  
  11. for($i = 1; $i < $argc; $i++)
  12. {
  13.    if($argv[$i][0] == '-')
  14.    {
  15.       $switches[] =& $argv[$i];
  16.    }
  17.    else
  18.    {
  19.       $directories[] =& $argv[$i];
  20.    }
  21. }
  22.  
  23. // TODO switches/options
  24.  
  25. foreach($directories as $dir)
  26. {
  27.    if(is_dir($dir))
  28.    {
  29.       for($i = 0; $i < 26; $i++)
  30.       {
  31.          mkdir("$dir/{$subs[$i]}");
  32.       }
  33.       mkdir("$dir/0-9");
  34.       mkdir("$dir/misc");
  35.      
  36.       $dh  = opendir($dir);
  37.       while (false !== ($f = readdir($dh)))
  38.       {
  39.          if(strspn($f, $subs_mask))
  40.          {
  41.             $d = strspn($f[0], '1234567890') ? '0-9' : strtolower($f[0]);
  42.             if(is_file("$dir/$f") || (is_dir("$dir/$f") && strlen($f) > 1 && $f != '0-9' && $f != 'misc'))
  43.             {
  44.                rename("$dir/$f", "$dir/$d/$f");
  45.             }
  46.          }
  47.          else if($f != '.' && $f != '..')
  48.          {
  49.             rename("$dir/$f", "$dir/misc/$f");
  50.          }
  51.       }
  52.       closedir($dh);
  53.    }
  54.    unset($files);
  55. }
Strong with this one, the sudo is.

Afficher de l'information

  • Total des messages de ce sujet: 3 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 59 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC