# [SCRIPT RUBY] Ranger son home facilement !

## man in the hill

Salut,

Ce script va ranger vôtre home très rapidement si vous avez un certains types de fichiers ... Il va créer un certains nombres de répertoires par défaut en fonction de leurs existences pour y mettre les fichiers  et si un répertoire reste vide , il vous sera demandé de l'effacer ...

I.) Les répertoires crées et le type d'extension pris en charge

* Documents : .pdf, .txt, .doc

* Images : .png, .jpg, .jpeg, .gif, .bmp, .svg, .tif, .tiff

* Musiques : .mp3, .wav, .asx, .ogg, .wma

* Archives: .tar, .tar.gz, .tgz, .tar.bz2, .rar, .zip, .Z, .ace

* Videos  : .avi, .mpeg, .mka, .mkv, .mpg, .rm, .rmvb, .wmv, .vob

*  Paquets : .deb, .rpm

* Java  : .java, .class

*  Cpp : .c, .cpp, .h, .hpp, .cxx

* HTML : .htm, .html, .css

* PHP : .php, .php3, .php4, .php5

* Scripts : .sh, .rb, .py, .pl

II.) Le Code

```

#!/usr/bin/ruby   -w

### Distributed under the terms of the GNU General Public License v2

#

### range comes with ABSOLUTELY NO WARRANTY !

#

### Inspirez du script de GarulfoLinux qui m'a fait un clin d'oeil (pour me donner du taff !) ...

#

### Author : Man in the Hill .

require  'getoptlong'

require  'fileutils'

include   FileUtils

class  Ordre

   

   def  test(dir)

           

      test = FileTest::directory?(dir)

           

           

      if     test == true

         puts "Le répertoire #{dir} ... EXIST ... [ OK ]\n\n"

           

      else

         puts "Le répertoire #{dir} ... N'EXISTE PAS !\n\n"

         puts "Création du répertoire #{dir} ...[ OK ]\n\n"

         Dir::mkdir("#{dir}", 0777)

               

      end   

         

   end     

   

   def   mouv()

     

      tab = %x(ls).split

     

      tab.each { |file|

         

         base = File::basename(file)

         ext = File::extname(file)

         

         case ext

           

            when ".pdf", ".txt", ".doc"

            mv("#{base}", "Documents")

           

            when ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg", ".tif", ".tiff"

            mv("#{base}", "Images")

           

            when ".mp3", ".wav", ".asx", ".ogg", ".wma" 

            mv("#{base}", "Musiques")

           

            when ".tar", ".gz", ".tgz", ".bz2", ".rar", ".zip", ".Z", ".ace"

            mv("#{base}",  "Archives")

         

            when ".avi", ".mpeg", ".mka", ".mkv", ".mpg", ".rm", ".rmvb",  ".wmv", ".vob"

            mv("#{base}", "Videos")

           

            when ".deb", ".rpm"

            mv("#{base}", "Paquets")

           

            when ".java", ".class"

            mv("#{base}", "Java")

           

            when  ".c", ".cpp", ".h", ".hpp", ".cxx"

            mv("#{base}", "Cpp")

           

            when ".htm", ".html", ".css"

            mv("#{base}", "HTML")

           

            when ".php", ".php3", ".php4", ".php5"

            mv("#{base}", "PHP")

           

            when ".sh", ".py", ".rb", ".pl"

            mv("#{base}", "Scripts")

      

         end

         }

   end   

     

   def  dossiervide(z)

      

      

      vide = %x(ls "#{z}")

      

      if  vide == ""

         puts "\n** Le répertoire #{z} est vide ! Voulez-vous l'effacer ?[Y/n]\n\n"

         choice = $stdin::gets.chomp

         

         case  choice.downcase

         

            when  "y", "yes"

            rm_rf("#{z}")

            puts "\nLe répertoire #{z} a été effacé ... [ OK ]\n\n"

            

            when "n", "no", "non"

            path = Dir::pwd

            puts "\nLe répertoire #{z} est dans #{path} ! Enjoy !\n\n"

            

            else

            puts "\nUne erreur c'est produite ! Afficher l'aide avec --help or -h !\n\n"

         

         end

      

      end

   end

   

   

   

   

end     

     

     

     

     

                                                                             

                                 

                                 # RANGE #

     

     

     

     

      # Création de l'objet "r" ...

      r = Ordre::new()

     

      # What Time is it ?

      t= Time.now.asctime

      puts "\n#{t}\n\n"

     

      # Option d'aide  ...

      opts = GetoptLong::new(['--help', '-h', GetoptLong::NO_ARGUMENT])

     

      # Traitement de l'option "help" ...

      opts.each do |opt, arg|

     

   case  opt

     

      when  "--help", "-h"

      puts "\n== Synopsis ==\n"

      puts "\nRange vos fichiers ..."

      puts "\n== Usage ==\n"

      puts "\nVous vous placez dans le répertoire ou se trouve tous vos fichiers à ranger ...\n"

      puts "\nLancer le script ...\n"

      puts "\nSi vous n'avez pas de fichiers dans une des catégories,\n"

      puts "\nle script vous demandera de supprimer le répertoire créé si il est vide !\n"

      puts "\nEx: Le script créer tous les répertoires par défaut et si vous n'avez pas de fichiers .java, .class,\n"

      puts "le répertoire Java créé sera vide alors il vous demandera de supprimer ce répertoire !\n"

      puts "\nSi vous constatez un bug faite moi signe !..\n"

      puts "\n== Fin ==\n\n"

      exit

      end

   end

     

      # Appelle de la méthode "test" ...

      r::test("Documents")

      r::test("Images")

      r::test("Musiques")

      r::test("Archives")

      r::test("Videos")

      r::test("Paquets")

      r::test("Java")

      r::test("Cpp")

      r::test("HTML")

      r::test("PHP")

      r::test("Scripts")

     

      # Appelle de la méthode "mouv" ...

      r::mouv()

     

      # tester si un répertoire est vide ...

      r::dossiervide("Documents")

      r::dossiervide("Images")

      r::dossiervide("Musiques")

      r::dossiervide("Archives")

      r::dossiervide("Videos")

      r::dossiervide("Paquets")

      r::dossiervide("Java")

      r::dossiervide("Cpp")

      r::dossiervide("HTML")

      r::dossiervide("PHP")

      r::dossiervide("Scripts")

     

exit
```

Si vous avez d'autres extensions à proposer !

Note : Si vous nommez le script avec une extension .rb et qu'il est dans le même répertoire de rangement, il va se retrouver dans le répertoire Scripts !... Vous lancez le script ainsi après l'avoir rendu exécutable:

```
chmod +x nom_du_srcipt    ** pour le rendre exécutable !
```

```
ruby  nom_du_sript
```

ou

```
./nom_du_script
```

Une petite aide est inclus avec l'option --help ou -h . 

J'ai rajouté le cas ou vous n'aurez pas de fichiers dans une des catégories, le script vous demandera de supprimer le répertoire crée si il est vide ...

Par ex : Si vous n'avez pas de fichier .java , .class et que le répertoire Java qui serra quand même créé (s'il n'existe pas , bien sûr) au lancement du script reste est vide, vous aurez la possibilité de le supprimer !

Effacez si vous êtes sûr qu'il n'y a pas de fichiers cachés dans ce répertoire car le script ne va pas les détecter !

Assurez-vous de ne pas avoir des fichiers avec des espaces dans les noms ! 

Enjoy !

                                                                        @ +

----------

## loopx

Yep, pour les extentions:

video: mpg rm rmvb wmv vob?

archive: ace

music: ogg wma 

cpp: cxx

image: tif (tiff?)

----------

## man in the hill

 *loopx wrote:*   

> Yep, pour les extentions:
> 
> video: mpg rm rmvb wmv vob?
> 
> archive: ace
> ...

 

Merci   :Wink:   :Cool:   !

----------

## Temet

"nrj" c'est pas plutot les iso made in Nero ça ?

----------

## cylgalad

Non, c'est .nrg...

Sinon un cerveau c'est très pratique pour faire du rangement...

----------

## man in the hill

 *Temet wrote:*   

> "nrj" c'est pas plutot les iso made in Nero ça ?

 

C'est une radio ça, non ? je déconne   :Laughing:  , franchement je n'ai pas pris la peine de vérifier  :Embarassed:  si c'est un iso ou une image ... mais je crois tu as raison cela doit être un iso ... Je vais l'enlever !   Merci !

 *cylgalad wrote:*   

> Non, c'est .nrg...
> 
> Sinon un cerveau c'est très pratique pour faire du rangement...

 

Les langages informatiques c'est fait pour faciliter la vie non ? et c'est le résultat d'un cerveau !  C'est le principe même de l'informatique qui est de réaliser des tâches !  je pense que tu es bien content quand tu utilises ce genre de commande  (ou les regex aussi ):

```
mv  *.tar.bz2     /répertoire
```

bash aurait pu être codé pour ne pas reconnaître le caractère *  et tu serais obligé de bouger chaque fichiers avec son nom complet ... 

En tout cas, merci à vous, c'est du pur libre ou vous pouvez critiquer, améliorer ou ne pas l'utiliser, of course !   :Very Happy:  ....

----------

## Temet

Bah, perso j'apprécie de partager et même si ce script n'est pas utile pour mon usage personnel, jamais je n'aurais l'idée de poster pour dire "Sinon un cerveau c'est très pratique pour faire du rangement..." o_O'.

Si ce script est utilisé par certaines personnes, alors tant mieux et merci man in the hill ! :Wink: 

----------

## man in the hill

 *Temet wrote:*   

> Bah, perso j'apprécie de partager et même si ce script n'est pas utile pour mon usage personnel, jamais je n'aurais l'idée de poster pour dire "Sinon un cerveau c'est très pratique pour faire du rangement..." o_O'.
> 
> Si ce script est utilisé par certaines personnes, alors tant mieux et merci man in the hill !

 

Merci Temet  :Wink:   !

                                                 @+

----------

## Sleeper

Sympa .. J'aurais juste externalisé les correspondances extensions -> repertoire de destination (pour pouvoir les éditer plus facilement par exemple ) dans un fichier YAML par exemple:

```

---

- extensions:

    - pdf

    - doc

  directory: /foo

- extensions:

    - c

    - h

  directory: /sources

```

Ton code a ensuite juste besoin de le relire:

```

require 'yaml'

rules = YAML.load_file( 'rules.yml' )

```

Tu te retrouves alors avec un tableau de hash, chaque hash ayant une cle extensions et une cle directory. Tu peux ensuite chercher le hash associe à une certaine extension:

```

rule = rules.find do |r|

  r['extensions'].includes?( ext )

end

mv base, r['directory'] unless r.nil?

```

Pour aller plus vite tu peux aussi créer un hash intermédiare, dont les clés sont les extensions et les valeurs le répertoires de destination  :Wink: 

Mes .2 cents

----------

## man in the hill

 *Sleeper wrote:*   

> Pour aller plus vite tu peux aussi créer un hash intermédiare, dont les clés sont les extensions et les valeurs le répertoires de destination 
> 
> Mes .2 cents

 

Pas mal tout çà   :Very Happy:  , je vais re-travailler le code ... j'apprends, j'apprends, c'est kool (  Cela fait un petit mois que j'apprends ruby ...)

Merci,

                                                              @ +

----------

## Sleeper

 *man in the hill wrote:*   

> 
> 
> Pas mal tout çà   , je vais re-travailler le code ... j'apprends, j'apprends, c'est kool (  Cela fait un petit mois que j'apprends ruby ...)
> 
> 

 

Tiens, une autre idée qui me vient: faire un petit DSL (Domain Specific Language). Du coup ton fichier de configuration serait un fichier ruby qui ressemblerait à:

```

move_files_with_extensions ['pdf','doc'], :to => "/foo/docs"

move_files_with_extensions ['c','h'], :to => "/foo/sources"

```

Encore plus sympa non ?

----------

## man in the hill

 *Sleeper wrote:*   

> Tiens, une autre idée qui me vient: faire un petit DSL (Domain Specific Language). Du coup ton fichier de configuration serait un fichier ruby qui ressemblerait à:
> 
> ```
> 
> move_files_with_extensions ['pdf','doc'], :to => "/foo/docs"
> ...

 

ça fuzze les idées, c'est kool   :Laughing: , je vais tester tout ça et si j'ai un soucis, je ferais appelle à toi   :Wink:  . ... Le DSL, je connaissais pas ...  

_-_ Pendant que j'y suis et que tu y es   :Very Happy:  ,  tu m'as l'air bien calé en ruby !

j'ai un petit soucis sur le script que je bosse en ce moment qui me casse bien les pieds, si tu as du temps de libre http://www.forum.moteurprog.com/Message.php?PAGE=3&ID_sujet=23291   tu peux remonter le fil de la discuss ...

                                                               @ +

[EDIT] Après une petite réflexion , Ce que je te propose c'est de modifier le script comme tu le sens car comme c'est un script que j'ai fais rapidement ... et on pourrait sûrement rajouter d'autres fonctionnalités ! et tu posts le résultat dans ce sous forum ...Sinon je vais l'améliorer mais pas tout de suite car ce script est juste une réaction instantané à la vu d'un script d'un pote donc tu peux faire pareil  :Wink:  , il n'y a pas de soucis   :Exclamation:  !  En tous cas il est fonctionnel à 100% dans son job ! Merci   :Cool:  !  @ + [/EDIT]

----------

