Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/05/2014, à 20:07

gershon09

Recherche code pour ranger et deplacer les fichiers d'un repertoire

Bonjour,

J'ai récupéré des données d'un disque dur deffectueux grace à photorec.
Je me retrouve avec une énorme quantité de fichiers classé par repertoire (rep1, rep2,...). Chaque repertoire contient 500 fichiers.

Vous connaissez un logiciel pour analyser le type de fichier contenu dans un repertoire et les déplacer en fonction de leut extensions dans un autre repertoire ?
En ligne de commande ca irait très bien.

Je pensais trouver ca facilement sur le forum, mais non :-)


Ma config : Xubuntu 20.04.6 LTS
Lenovo E580, Processeur Intel Core i7-8550U
12 Go de mémoire DDR4, AMD Radeon RX 550 2 Go

Hors ligne

#2 Le 27/05/2014, à 20:50

gershon09

Re : Recherche code pour ranger et deplacer les fichiers d'un repertoire

J'ai résolu en utilisant matlab, voici le code :

C'est bon pour les fichiers images, pour les autre il faut modifier les extensions....

clear all
clc
close all


home = ['/media/DATA/repertoire_a_trier/']; 
name = ['recup_dir.']; % c'est le nom des repertoires donnés par photorec


kk = 0;

for i = 1:1244 % c'est le nombre de repertoire donnés par photorec



folder = [home,name,num2str(i),'/']
listing = dir(folder);
destination = ['/media/DATA/repertoire_de_tri/'];
nomfichier = 'nom_fichier'; % ca sera le nom de chaque fichier sauver (avec un incrément en suffixe)
s = size(listing);


for j = 3:s(1)
    
    
    file = listing(j).name;
    s2 = size(file);
    extension = file(s2(2)-2:s2(2));
    source = [folder,file];
    
    if extension == 'png'
        kk = kk+1;
        destination_ext = [destination,'png/',nomfichier,num2str(kk),'.png'];
        copyfile(source,destination_ext)
    end
    
end


%%%%%%%%%%%%%%   note %%%%%%%%%%%
% le code ci dessous est répété pour chaque type d'image, ca serait beaucoup mieux en faisant une 
% fonction. J'ai eu la flemme....


for j = 3:s(1)
    
    
    file = listing(j).name;
    s2 = size(file);
    extension = file(s2(2)-2:s2(2));
    source = [folder,file];
    
    if extension == 'jpg'   % on aurait pu mettre 'mpg' ou 'avi' pour trouver des vidéos
        kk = kk+1;
        destination_ext = [destination,'jpg/',nomfichier,num2str(kk),'.jpg'];
        copyfile(source,destination_ext)
    end
    
end


%%%%%%%%%%% fin note %%%%%%%%%%%%

for j = 3:s(1)
    
    
    file = listing(j).name;
    s2 = size(file);
    extension = file(s2(2)-2:s2(2));
    source = [folder,file];
    
    if extension == 'bmp'
        
        kk = kk+1;
        destination_ext = [destination,'bmp/',nomfichier,num2str(kk),'.bmp'];
        copyfile(source,destination_ext)
    end
    
end

for j = 3:s(1)
    
    
    file = listing(j).name;
    s2 = size(file);
    extension = file(s2(2)-2:s2(2));
    source = [folder,file];
    
    if extension == 'iff'
        destination_ext = [destination,'tif/',nomfichier,num2str(kk),'.tif'];
        copyfile(source,destination_ext)
        kk = kk+1;
    end
    
end



for j = 3:s(1)
    
    
    file = listing(j).name;
    s2 = size(file);
    extension = file(s2(2)-2:s2(2));
    source = [folder,file];
    
    if extension == 'peg'
        destination_ext = [destination,'peg/',nomfichier,num2str(kk),'.peg'];
        copyfile(source,destination_ext)
        kk = kk+1;
    end
    
end


end

Dernière modification par gershon09 (Le 28/05/2014, à 13:44)


Ma config : Xubuntu 20.04.6 LTS
Lenovo E580, Processeur Intel Core i7-8550U
12 Go de mémoire DDR4, AMD Radeon RX 550 2 Go

Hors ligne

#3 Le 27/05/2014, à 21:50

bishop.sad.clown

Re : Recherche code pour ranger et deplacer les fichiers d'un repertoire

pt-être qlq chose comme:

find /dossier/des/fichiers/à/trier/ -type f | while IFS=$'\n' read f ; do EXT="$(echo "$f" | sed -n 's/.*\.\(.*$\)/\1/p')" ; case "$EXT" in ; ext1) mv "$f" /destination_pour_ext1 ;; ext2) mv "$f" /destination_pour_ext2 ;; ext3) mv "$f" /destination_pour_ext3 ;; *) echo "Type de fichier non reconnu" ; esac ; done

Tu vois l'principe ?


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#4 Le 28/05/2014, à 00:22

Postmortem

Re : Recherche code pour ranger et deplacer les fichiers d'un repertoire

Salut,

bishop.sad.clown a écrit :

pt-être qlq chose comme:

find /dossier/des/fichiers/à/trier/ -type f | while IFS=$'\n' read f ; do EXT="$(echo "$f" | sed -n 's/.*\.\(.*$\)/\1/p')" ; case "$EXT" in ; ext1) mv "$f" /destination_pour_ext1 ;; ext2) mv "$f" /destination_pour_ext2 ;; ext3) mv "$f" /destination_pour_ext3 ;; *) echo "Type de fichier non reconnu" ; esac ; done

Pourquoi mettre IFS=$'\n' ? Ça ne sert à rien, read lit ligne par ligne par défaut.
Je ferais comme ça :

#!/bin/bash
source="/chemin/de/tous/les/répertoires/récupérés"
dest="/répertoire/destination" # la destination ne doit pas être un sous-répertoire de la source
while read -rd ''
do
   fic=${REPLY##*/}
   base=${fic%.*}
   ext=${fic##*.}
   mkdir -p "$dest/$ext"
   i=1
   while [[ -f $dest/$ext/$fic ]]
   do
      fic=$base-$((i++)).$ext
   done
   mv "$REPLY" "$dest/$ext/$fic"
done < <(find "$source" -type f -print0)

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 28/05/2014, à 13:47

gershon09

Re : Recherche code pour ranger et deplacer les fichiers d'un repertoire

Merci, je suis en train d'apprendre le C, donc ca fait une belle etude de cas :-)


Ma config : Xubuntu 20.04.6 LTS
Lenovo E580, Processeur Intel Core i7-8550U
12 Go de mémoire DDR4, AMD Radeon RX 550 2 Go

Hors ligne

#6 Le 29/05/2014, à 21:49

bishop.sad.clown

Re : Recherche code pour ranger et deplacer les fichiers d'un repertoire

Pourquoi mettre IFS=$'\n' ? Ça ne sert à rien, read lit ligne par ligne par défaut.

Par défaut oui mais quand j'utilise une variable j'aime bien l'initialiser par précaution... Au moins je suis certain de celle-ci...


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#7 Le 29/05/2014, à 23:22

Postmortem

Re : Recherche code pour ranger et deplacer les fichiers d'un repertoire

bishop.sad.clown a écrit :

Pourquoi mettre IFS=$'\n' ? Ça ne sert à rien, read lit ligne par ligne par défaut.

Par défaut oui mais quand j'utilise une variable j'aime bien l'initialiser par précaution... Au moins je suis certain de celle-ci...

Mon commentaire était erroné mais ton utilisation de l'IFS ainsi n'est pas bonne. Dans ton cas, c'est la valeur nulle qu'il fallait donner à l'IFS (même si ça donne le même résultat mais c'est plus logique).
Tu peux mettre ce que tu veux dans l'IFS, read lira toujours jusqu'à la fin de ligne, sauf si tu lui passes l'option -d <caractère> ; à ce moment là, read lira jusqu'à <caractère> et non pas jusqu'à la fin de ligne.
L'IFS sert quand on veut découper la ligne (ou ne pas la découper) pour affecter la ligne à plusieurs variables :

$ IFS=, read t u
hjk jjkjh , jk
$ echo "#$t#"
#hjk jjkjh #
$ echo "#$u#"
# jk#

Mettre l'IFS à $'\n' devant read donne la même chose que de lui mettre une valeur nulle, il n'y a plus de découpage :

$ IFS=$'\n' read t u
hjk jjkjh , jk
$ echo "#$t#"
#hjk jjkjh , jk#
$ echo "#$u#"
##
$ IFS= read t u
hjk jjkjh , jk
$ echo "#$t#"
#hjk jjkjh , jk#
$ echo "#$u#"
##

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne