IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Déplacement de fichiers par x quantités


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Par défaut Déplacement de fichiers par x quantités
    bonjour j'ai actuellement un repertoire contenant tellement de fichier que je n'en connait pas le nombre exact (resultat d'une videosurveillance perso)

    je souhaiterais faire des repertoires d'environ 5000 fichiers pour pouvoir les trier par date ulterieurement.

    mon probleme est que je ne trouve pas comment faire cette demarche (je debute en shell).
    sur de plus petit repertoires j'ai trouver comment deplacer les fichier en fonction de la date pour les mettre dans un rep avec le nom de cette meme date.
    mais la je ne connais pas les dates des fichiers contenus ce tres gros repertoire.
    l'idee selon moi passerais par une boucle mais je ne vois pas du tout comment la structurer.

    merci

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Quel système d'exploitation utilises tu ? Quel système de fichiers ? Pourquoi ne pas les trier par date tout de suite ? Pourquoi des répertoires de 5000 fichiers ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Par défaut
    le système d'exploitation utilisé est un système embarqué sur un nas dns-323 base sur linux avec fun-plug installé, auquel j’accède par telnet

    le système de fichier est ext3

    je ne peut pas les trier maintenant car je ne connait pas la date exacte des fichiers et que pour le moment, sur les fichier dont je connaissaient la date, j'utilisais cette dernière pour générer les répertoires de stockage selon l'arborescence suivante:
    --> mois
    .............|--> jour
    .........................| --> heure
    .........................| --> heure
    .............|--> jour
    .........................| --> heure
    .........................| --> heure

    et je fais a partir du nom suivant:

    E8ABFA1014FE(cam_ext)_1_20130701042841_171173.jpg"

    ou je récupère a la main, après l'underscore qui suis le 1 tout seul, la chaîne de caractère qui contient la date et l'heure mais vu que sur le répertoire qui m’intéresse je ne connaît pas les dates je ne peut pas le faire.

    je souhaite des répertoires de 5000 fichiers juste pour pouvoir les ouvrir relativement facilement a travers le réseau et pouvoir lire mes fichiers pour les trier.

    merci

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Si tous tes fichier suivent le même format, un script comme celui-ci suffit à créer et et ranger les fichiers dans les bons répertoires:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    find repertoire -name "*.jpg" -exec bash -c '
    for i do
      echo "$i"
      ts=$(echo "$i" | sed -e 's/.*_1_//' -e 's/......_......\.jpg//')
      y=${ts:0:4}
      m=${ts:4:2}
      d=${ts:6:2}
      echo mkdir -p $y/$m/$d
      echo mv "$i" $y/$m/$d
    done' bash {} +
    Retirer les "echo" devant "mkdir" et "mv" si ok.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Par défaut
    merci je regarde, fais un essais et te tiens au courants.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Par défaut
    donc je te donne des nouvelles tout est impec ton script avec une petite variante tourne depuis hier 17h30 .

    mais si cela ne t’embête pas pourrais-tu confirmer et expliquer quelques truc dans le script?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    find $1 -iname "*.jpg" -exec bash -c '
    for i do
    	echo "$i"
    	ts=$(echo "$i" | sed -e 's/.*_1_//' -e 's/...._......\.jpg//')
    	y=${ts:0:4}
    	m=${ts:4:2}
    	d=${ts:6:2}
    	h=${ts:8:2}
    	mkdir -p $y/$m/$d/$h
    	mv "$i" $y/$m/$d/$h
    done' bash {} +
    1e question : le -exec bash -c je ne connais pas peux-tu donner un ou deux détails ? ainsi que sur bash {} +

    2e question: dans sed le premier -e sert a remplacer tout ce qu'il y a jusqu'au "1_" par rien "//" si oui je ne comprend pas le fonctionnement de la deuxième partie.j'ai bien compris qu'elle servait à générer les variables d’année, mois, ... puisque j'ai réussi à faire une modif à ce niveau, mais je n'ai pas compris le fonctionnement du 2e "-e" .

    3e question: je souhaiterais compter les fichier de chaque répertoire et renommer chaque répertoire avec en plus le nombre de fichier:

    2013
    ....|---> 06
    .............|---> 18
    .......................|--> 17-75
    ce qui donnerait que dans le répertoire du 18 06 2013 17h il y a 75 fichiers.

    pour ce faire je comptais me positionner sur le répertoire jour pour lancer le script en faisant une boucle "for" avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NBFICH1=$(ls -A1 $rep | wc -l) 
    mv $rep $rep-$NBFICH1
    merci d'avance

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par irambecker Voir le message
    1e question : le -exec bash -c je ne connais pas peux-tu donner un ou deux details ? ainsi que sur bash {} +
    les deux vont ensemble. Ca lance des scripts shell (bash) qui recoivent en paramètres une liste de fichiers.
    2e question: dans sed le premier -e sert a remplacer tout ce qu'il y a jusqu'au "1_" par rien "//" si oui je ne comprend pas le fonctionnement de la deuxieme partie.
    La deuxième partie ne servait déjà pas à grand chose dans mon script mais ne sert probablement plus à rien dans ta version modifiée, d'autant plus que comme to as mis -iname au lieu de -name, les suffixes des fichiers sont probablement .JPG et pas .jpg. Tu peux de toute façon supprimer le deuxième -e.
    3e question: je souhaiterais compter les fichier de chaque repertoire et renomer chaque repertoire avec en plus le nombre de fichier:
    ...
    pour ce faire je comptais me positionner sur le repertoire jour pour lancer le script en faisant une boucle "for" avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NBFICH1=$(ls -A1 $rep | wc -l) 
    mv $rep $rep-$NBFICH1
    les options de ls ainsi que la variable sont inutiles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(ls $rep|wc -l)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Par défaut
    je te remercie tu m'as ete d'une tres grande aide.

    mon soucis est resolu

    je te souhaite bonne continuation @+

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par irambecker Voir le message
    pourrais-tu confirmer et expliquer quelques truc dans le script?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    find $1 -iname "*.jpg" -exec bash -c '
    for i do
    	echo "$i"
    	ts=$(echo "$i" | sed -e 's/.*_1_//' -e 's/...._......\.jpg//')
    	y=${ts:0:4}
    	m=${ts:4:2}
    	d=${ts:6:2}
    	h=${ts:8:2}
    	mkdir -p $y/$m/$d/$h
    	mv "$i" $y/$m/$d/$h
    done' bash {} +
    1e question : le -exec bash -c je ne connais pas peux-tu donner un ou deux détails ? ainsi que sur bash {} +
    Ce sont des options/arguments de 'find'.

    Si tu fais find $1 -iname "*.jpg" -print, ça demande à 'find' d'imprimer le nom des fichiers trouvés.

    En gros, ici, l'instruction find $1 -iname "*.jpg" -exec bash -c 'une_grosse_commande' bash {} + demande à 'find' de collecter les fichiers et de passer le tout en un bloc (grâce à l'argument '+') à une commande (grâce à l'option '-exec'), laquelle est un appel de 'bash' (1ère occurrence) qui a lui-même comme arguments l'option '-c' qui lui indique que la chaîne qui suit est un script bash qui doit prendre en argument le 2ème bash (mais je ne comprends pas pourquoi???) et surtout le '{}' qui représente la liste des fichiers. Ouf...

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    les options de ls ainsi que la variable sont inutiles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(ls $rep|wc -l)
    [chipotage]
    L'option -1 de ls est effectivement inutile.
    L'option -A de ls permet de liste les fichiers "invisibles" (dont le nom commence par le caractère '.' (à l'exclusion de '.' et '..')).

    Bref, s'il y a des fichiers "invisibles", mieux vaut garder l'option -A
    Dans le doute, je la garderais... vu que ça ne gêne pas!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(ls -A $rep|wc -l)
    [superchipotage]
    Sous d'autres systèmes que linux (genre AIX (si ma mémoire est bonne)), la commande wc -l insère des espaces ou une tabulation dans son formatage de sortie, ce qui pourrait être gênant dans le nom du répertoire!
    Dans ce cas, une manière de se débarrasser des espaces en combrants est... justement d'utiliser une variable (typée entière):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeset -i nb=$(ls -A $rep|wc -l)
    Mais là, ce serait vraiment pas de bol...
    [/superchipotage]
    [/chipotage]

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    l'option '-c' qui lui indique que la chaîne qui suit est un script bash qui doit prendre en argument le 2ème bash (mais je ne comprends pas pourquoi???)
    Le deuxième bash est là pour renseigner "$0", c'est à dire le nom de la commande elle-même. J'ai mis "bash" pour être cohérent mais j'aurais pu mettre n'importe quelle chaine de caractère comme toto ou titi sans conséquence sur le résultat du script.

  12. #12
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    [chipotage]Bref, s'il y a des fichiers "invisibles", mieux vaut garder l'option -A
    Dans le doute, je la garderais... vu que ça ne gêne pas!
    Il n'y avait pas de doute pour moi puisqu'on vient de créer les répertoires et aucun des fichiers qui l'on à placé dedans n'est invisible d'après le format fourni.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(ls -A $rep|wc -l)
    [superchipotage]
    Sous d'autres systèmes que linux (genre AIX (si ma mémoire est bonne)), la commande wc -l insère des espaces ou une tabulation dans son formatage de sortie, ce qui pourrait être gênant dans le nom du répertoire!
    Dans ce cas, une manière de se débarrasser des espaces en combrants est... justement d'utiliser une variable (typée entière):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeset -i nb=$(ls -A $rep|wc -l)
    Mais là, ce serait vraiment pas de bol...
    [/superchipotage]
    [/chipotage]
    La question étant posée pour Linux, le problème ne se pose pas mais puisqu'on est dans le forum POSIX/autre systèmes, il faut en effet mettre en garde contre ce problème, à priori présent au moins sous tous les OS utilisant un "wc" dérivé de SVR4 (Solaris, AIX, HPUX, etc ...).
    "typeset -i" n'étant pas POSIX, une solution portable peut être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(echo $(ls $rep|wc -l))

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Il n'y avait pas de doute pour moi puisqu'on vient de créer les répertoires et aucun des fichiers qui l'on à placé dedans n'est invisible d'après le format fourni.
    Ben... pour les répertoires, ok, mais, pour les fichiers, on ne peut pas savoir s'il n'y en a pas dont le nom commence par '.'...

    Je vérifie au niveau du code pour être sûr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ touch .toto.jpg
    $ find . -name '*.jpg' -print
    ./.toto.jpg
     
    $ /bin/ls . | wc -l
           0
     
    $ /bin/ls -A . | wc -l
           1
    Donc, je persiste: dans le doute, autant mettre l'option -A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(ls -A $rep|wc -l)
    La question étant posée pour Linux, le problème ne se pose pas mais puisqu'on est dans le forum POSIX/autre systèmes, il faut en effet mettre en garde contre ce problème, à priori présent au moins sous tous les OS utilisant un "wc" dérivé de SVR4 (Solaris, AIX, HPUX, etc ...).
    "typeset -i" n'étant pas POSIX, une solution portable peut être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv $rep $rep-$(echo $(ls $rep|wc -l))


    Pendant qu'on y est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv "$rep" "$rep"-$(echo $(ls "$rep"|wc -l))
    pour le cas où "$rep" contiendrait des espaces (ou autres caractères de l'IFS).
    mais, là c'est vraiment du chipotage... (une fois n'est pas coutume)

  14. #14
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ben... pour les répertoires, ok, mais, pour les fichiers, on ne peut pas savoir s'il n'y en a pas dont le nom commence par '.'...
    Les fichiers ont on nom qui commence manifestement par un préfixe en hexadécimal, c'est ce qui me fait penser que le "." est exclu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv "$rep" "$rep"-$(echo $(ls "$rep"|wc -l))
    pour le cas où "$rep" contiendrait des espaces (ou autres caractères de l'IFS).
    mais, là c'est vraiment du chipotage... (une fois n'est pas coutume)
    On vient de créer "$rep", qui contient uniquement l'heure codée de 00 à 23 (cf. "04" dans le fichier exemple), aucun risque donc de tomber sur un espace.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création de fichiers par déplacement
    Par FotoXe33 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 30/10/2009, 16h59
  2. Réponses: 17
    Dernier message: 15/05/2007, 18h35
  3. Peut on manipuler le système de fichier par T-SQL?
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2003, 09h19
  4. Réponses: 1
    Dernier message: 19/08/2003, 16h11
  5. Supprimer un fichier par rapport a une date
    Par NewB dans le forum Linux
    Réponses: 2
    Dernier message: 25/06/2003, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo