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 03/08/2019, à 15:20

FalCT60

[Résolu] Transfert ordonné d'un disque vers un autre

Bonjour,

Mon problème : transférer de manière ordonnée les répertoires et leur contenu d'un disque vers un autre.
Ma source s'appelle Photos01, la destination Photos.
Pour copier par alpha les répertoires de Photos01 vers Photos, je fais

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort | while read -r -d '' f1
do
mkdir "${f1/Photos01/Photos}"
done

Le hic, c'est que si j'enchaîne avec

find "$f1" -iname '*.NEF*' -type f -print0 | sort | while read -r -d '' f2
do
cp "$f2" "$(dirname "${f1/Photos01/Photos}")"
done

les fichiers sont traités dans leur globalité, et non répertoire par répertoire.
Du coup, j'ai tenté d'imbriquer les deux commandes, comme cela

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort | while read -r -d '' f1
do
mkdir "${f1/Photos01/Photos}"
    find "$f1" -iname '*.NEF*' -type f -print0 | sort | while read -r -d '' f2
    do
    cp "$f2" "$(dirname "${f1/Photos01/Photos}")"
    done
done

pensant qu'après création de chaque répertoire seul son contenu serait exploré et copié, mais ça se comporte bizarrement.
De toute évidence, je ne m'y prends pas de la bonne manière, mais je suis incapable de comprendre ce qui ne va pas.
Un petit coup de pouce ne serait pas de refus, avec mes plus vifs remerciements par anticipation.

J.-Luc

Dernière modification par FalCT60 (Le 07/08/2019, à 11:10)

Hors ligne

#2 Le 03/08/2019, à 15:30

Vobul

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Ce serait plus facile pour t'aider si tu expliquais précisemment ce que tu cherches à faire et pourquoi. Parce que si tu veux transférer des données, utilise "rsync". Si tu veux les renommer, utilise "rename", si tu veux les réordonner, un script bash ou python fera l'affaire. Là on sait pas trop bien ce que tu cherches à faire... une espèce de mélange des trois...


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#3 Le 03/08/2019, à 16:07

FalCT60

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Il me semblait pourtant bien avoir précisé mon besoin. Je vais tenter d'être plus clair.
Je veux copier répertoires et fichiers d'un disque à un autre.
Mais je veux que les fichiers soient copiés répertoire par répertoire, par alpha, après que les répertoires aient, eux-mêmes, été créés dans l'ordre.
Tant que tous les fichiers du répertoire A du disque 1 n'auront pas été copiés par alpha dans le répertoire A du disque 2, les fichiers des autres répertoires ne devront pas être traités.
Ce qui n'est pas le cas avec ma première tentative, puisque les fichiers sont traités sur l'ensemble des répertoires du disque 1.
Voilà...

Hors ligne

#4 Le 03/08/2019, à 16:09

kamaris

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Il y a diverses choses inutiles ou qui devraient être écrites autrement dans ton code. Mais sans entrer dans tout ça, et pour répondre de manière minimale à ta question, je pense qu'il faut que tu utilises l'option -maxdepth de find :

find "$f1" -maxdepth 1 -iname '*.NEF*' -type f -print0 | sort | while read -r -d '' f2

Hors ligne

#5 Le 03/08/2019, à 17:30

FalCT60

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Aïe ! je viens d'avoir comme une secousse... de celles qu'on ressent lorsqu'on a l’impression d'avoir fait une énorme connerie...
Dis-moi si je viens bien de comprendre : se pourrait-il que le résultat de l'évaluation de ma première commande, tout au début, soit

/media/jean-luc/Photos01/

alors que je souhaite avoir un niveau en-dessous ? Soit, par exemple,

/media/jean-luc/Photos01/20080515/

.
Au risque de me répéter : pour chaque répertoire contenu dans /media/jean-luc/Photos01/, je souhaite le créer dans /media/jean-luc/Photos/ puis y copier par alpha chacun des fichiers qu'il contient, faire de même avec le répertoire suivant, jusqu'au dernier.
Je me sens un peu mal, là...

Hors ligne

#6 Le 03/08/2019, à 17:59

kamaris

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Non, non, je n'ai pas testé, mais à la lecture, ta première commande fait bien ce que tu veux.
Par contre, il faut que tu rajoutes un « -maxdepth 1 » dans ton second find, pour qu'il n'aille chercher les fichiers *.NEF* que dans le répertoire $f1, et pas dans toute l'arborescence qu'il contient.
Donc au final, en rajoutant simplement -maxdepth 1 au second find dans ton code complet, ça ferait

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort | while read -r -d '' f1
do
    mkdir "${f1/Photos01/Photos}"
    find "$f1" -maxdepth 1 -iname '*.NEF*' -type f -print0 | sort | while read -r -d '' f2
    do
        cp "$f2" "$(dirname "${f1/Photos01/Photos}")"
    done
done

Hors ligne

#7 Le 03/08/2019, à 18:22

Watael

Re : [Résolu] Transfert ordonné d'un disque vers un autre

pourquoi refaire un find et pas simplement une boucle for ?
on pourrait même supprimer le premier find :

#!/bin/bash

src=/media...

#find -type d ... | while read -rd '' dir
shopt -s nullglob globstar
for dir in "$src"/**/*/
do
   test -d "$dir" || mkdir ...
   for f in "$dir"/*.NEF
   do
      test -f "$f" && cp ...
   done
done 

bash développe les chemins en respectant l'ordre alphabétique.

Dernière modification par Watael (Le 03/08/2019, à 18:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 03/08/2019, à 18:38

kamaris

Re : [Résolu] Transfert ordonné d'un disque vers un autre

@MicP : si, je pense que tu avais raison de supprimer le dirname, par contre je pense aussi qu'il faut laisser le maxdepth si il y a une arborescence dans les répertoires 2*. Donc au final, je dirais

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort | while read -r -d '' f1
do
    mkdir "${f1/Photos01/Photos}"
    find "$f1" -maxdepth 1 -iname '*.NEF*' -type f -print0 | sort | while read -r -d '' f2
    do
        cp "$f2" "${f1/Photos01/Photos}"
    done
done

Hors ligne

#9 Le 03/08/2019, à 20:28

MicP

Re : [Résolu] Transfert ordonné d'un disque vers un autre

@kamari

Je m'étais laissé allé (en mode fatigué) à reprendre et modifier légèrement le script proposé
mais quand j'ai vu la proposition de Watael,
je me suis dit qu'il valait mieux suivre ses conseils (comme toujours d'ailleurs)
plutôt que de lancer des find quand il y a déjà tout ce qu'il faut dans bash.

Hors ligne

#10 Le 03/08/2019, à 21:31

FalCT60

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Si je comprends bien, c'est lorsque l'on croit avoir tout compris que l'on se rend compte, qu'en fait, l'on n'a rien compris du tout. sad
@Watael : parce que la fois où je m'étais hasardé à proposer une boucle for, je m'étais fait incendier au motif que find est plus puissant, plus rapide, plus mieux, plus ergonomique, plus... que sais-je ?
Et c'est vrai que j'ai eu maintes fois l'occasion de m'en servir, mais toujours de manière superficielle. Là, j'ai voulu aller un cran au-dessus, faire exécuter au système des tâches que j'effectuais à côté via un tableur : récolter les fichiers, séparer le nom du répertoire, créer une commande cp, la tirer sur toutes les lignes concernées, rajouter les créations de répertoires au début, trier sur les noms de répertoires et fichiers, copier le tout dans un .sh et l'exécuter manuellement - ouf !
@ tous : merci pour vos contributions, que je vais potasser. et vous tenir informés.

Dernière modification par FalCT60 (Le 03/08/2019, à 21:32)

Hors ligne

#11 Le 03/08/2019, à 23:31

Watael

Re : [Résolu] Transfert ordonné d'un disque vers un autre

find est plus puissant, plus rapide, plus mieux, plus ergonomique, plus... que sais-je ?

c'est vrai,
jusqu'à ce qu'on en parse la sortie avec un autre find hmm
avec à chaque fois un tri yikes

smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 04/08/2019, à 08:33

DonutMan75

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Bonjour à tous,
dans la solution proposée par Watael, que signifie le double ** ?

for dir in "$src"/**/*/

Merci d'avance smile

Donut

Hors ligne

#13 Le 04/08/2019, à 09:03

MicP

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Dans son script,
Watael a d'abord positionné à set l'option du shell nommée globstar

…
shopt -s nullglob globstar
…
man bash a écrit :
…
  globstar
        Si existante, le motif ** utilisé dans un contexte de développement des chemins
          correspondra à tous les fichiers et zéro ou plusieurs répertoires et sous-répertoires.
        Si le motif est suivi de /, seuls les répertoires et sous-répertoires correspondent.
…

Dernière modification par MicP (Le 04/08/2019, à 09:10)

Hors ligne

#14 Le 04/08/2019, à 10:32

serged

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Plutôt que de réinventer la roue, rsync tu connais ? sans parler de cp avec l'option -R...


LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#15 Le 04/08/2019, à 15:42

FalCT60

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Bonjour,
@ serged : s'il possible de «dire» à rsync :

  1. trie-moi tous les répertoires par [critère] de ma source

  2. à partir du premier répertoire trié par [critère], copie-le dans la destination, puis copie-s'y tous les fichiers qu'il contient triés par [critère]

  3. enchaîne jusqu'au dernier.

alors je veux bien me replonger dans le manuel de cette commande, car je n'ai pas trouvé d'explication sur le moyen d'y parvenir.
@ kamaris : j'ai recommencé trois fois, car j'avais peur de m'être planté quelque part... mais, non : ça ne fonctionne pas (totalement) comme cela devrait.
Ne fût-ce qu'au niveau des répertoires, ça semble démarrer bien, puis soudain, ça saute une partie des répertoires, puis ça continue normalement, puis ça revient à un niveau que ça avait sauté, et ça repart normalement.
Pour en être certain, j'ai inséré des sorties dans le script :

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort -n | while read -r -d '' f1
do
    mkdir "${f1/Photos01/Photos}"
    printf '%s\n' "$f1" >> Copie_Dossiers.txt
    find "$f1" -maxdepth 1 -iname '*.NEF*' -type f -print0 | sort -n | while read -r -d '' f2
    do
        cp "$f2" "${f1/Photos01/Photos}"
	printf '%s;%s\n' "$f2" "${f1/Photos01/Photos}" >> Copie_Fichiers.txt
    done
done

le résultat est dans le fichier que voilà (j'ai hésité, puis j'ai préféré éviter de surcharger avec une aussi longue liste, n'hésitez pas à me dire si je dois y revenir).
@ Watael : j'ai du mal à saisir, car, dans mon esprit, après le premier find, le second n'évalue que les fichiers du répertoire qui lui a été transmis, puis passe au suivant, etc. Serais-je dans l'erreur ? Le processus serait-il totalement différent ?
Autre chose, tu écris :

Watael a écrit :

bash développe les chemins en respectant l'ordre alphabétique.

pourtant, chaque fois que j'ai effectué un cp ou un mv, les fichiers ont été traités dans l'ordre dans lequel ils avaient été enregistrés sur la source. Dans le cas contraire, je ne me serais pas pris la tête...

Hors ligne

#16 Le 04/08/2019, à 15:50

melixgaro

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Bonjour,

Curiosite : la question que je me pose est pourquoi faut-il que l'ordre d'enregistrement/copie corresponde à l'ordre alphabétique ?


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#17 Le 04/08/2019, à 17:25

Watael

Re : [Résolu] Transfert ordonné d'un disque vers un autre

cp et mv sont des commandes externes, contrairement à echo, printf, for, etc.

après le premier find, le second n'évalue que les fichiers du répertoire qui lui a été transmis

- tu lis en shell
- le tri
- d'une commande find à laquelle
- tu passes en shell
- le tri
- d'une commande find
pfiou!
ou alors
- tu lis en shell les répertoires,
- puis les fichiers de chacun de ces répertoires.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 04/08/2019, à 23:21

kamaris

Re : [Résolu] Transfert ordonné d'un disque vers un autre

FalCT60 a écrit :

@ kamaris : j'ai recommencé trois fois, car j'avais peur de m'être planté quelque part... mais, non : ça ne fonctionne pas (totalement) comme cela devrait.
Ne fût-ce qu'au niveau des répertoires, ça semble démarrer bien, puis soudain, ça saute une partie des répertoires, puis ça continue normalement, puis ça revient à un niveau que ça avait sauté, et ça repart normalement.
Pour en être certain, j'ai inséré des sorties dans le script :

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort -n | while read -r -d '' f1
do
    mkdir "${f1/Photos01/Photos}"
    printf '%s\n' "$f1" >> Copie_Dossiers.txt
    find "$f1" -maxdepth 1 -iname '*.NEF*' -type f -print0 | sort -n | while read -r -d '' f2
    do
        cp "$f2" "${f1/Photos01/Photos}"
	printf '%s;%s\n' "$f2" "${f1/Photos01/Photos}" >> Copie_Fichiers.txt
    done
done

le résultat est dans le fichier que voilà (j'ai hésité, puis j'ai préféré éviter de surcharger avec une aussi longue liste, n'hésitez pas à me dire si je dois y revenir).

Ah oui, c'est le print0 qui demande à être mis en cohérence avec le délimiteur du sort : soit tu mets print0 et sort -z, soit tu mets print et sort. Par contre le sort -n est inutile car en l'occurrence, tes noms de répertoires se trient alphabétiquement. Donc en conservant le print0 ça donne

find /media/jean-luc/Photos01/ -iname '2*' -type d -print0 | sort -z | while read -r -d '' f1
do
    mkdir "${f1/Photos01/Photos}"
    find "$f1" -maxdepth 1 -iname '*.NEF*' -type f -print0 | sort -z | while read -r -d '' f2
    do
        cp "$f2" "${f1/Photos01/Photos}"
    done
done

Hors ligne

#19 Le 05/08/2019, à 13:38

FalCT60

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Bonjour,

@ Watael : voyons si j'ai bien pigé (ça m'a tout de même demandé un peu de temps...) ; ça, c'est la charge que doit supporter le système en exécutant mon code :

- tu lis en shell
- le tri
- d'une commande find à laquelle
- tu passes en shell
- le tri
- d'une commande find

et ça, c'est ce qu'il en découlerait de l'exécution du tien, tel que donné en #7 :

- tu lis en shell les répertoires,
- puis les fichiers de chacun de ces répertoires.

Effectivement, il n'y a pas photo, je note ça dans un coin pour une prochaine fois.

@ kamaris : c'est donc moi qui faisais dérailler la machine ? Pas glop ! sad

Merci à tous pour votre concours ; je laisse le fil ouvert encore un jour ou deux, s'il s'avérait que j'eusse d'autres questions, puis je le fermerai.

J.-Luc

Hors ligne

#20 Le 05/08/2019, à 18:50

melixgaro

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Salut,
Je retente ma chance avec ma curiosité avant que tu ne délaisses ce fil wink

melixgaro a écrit :

Bonjour,

Curiosite : la question que je me pose est pourquoi faut-il que l'ordre d'enregistrement/copie corresponde à l'ordre alphabétique ?


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#21 Le 07/08/2019, à 11:09

FalCT60

Re : [Résolu] Transfert ordonné d'un disque vers un autre

Bonjour,

Parce que cela m'est demandé et que, si j'ai bien compris, le truc qui va les récupérer traite les données telles qu'elles sont inscrites sur le disque.
Les tests sur mes propres photos sont OK, je dois récupérer le disque contenant celles devant faire l'objet du traitement aujourd'hui ou demain.
Pour la petite histoire, cela ne me rapporte rien (à part des migraines pour le côté négatif, et d'apprendre de nouvelles choses pour le côté positif), et comme j'ai d'autres chats à fouetter, la prochaine fois ils iront s'adresser ailleurs. Assez encaissé de remarques désobligeantes en ce qui me concerne.

Encore merci à tous les intervenants, dont certains ont bousculé mes certitudes mais m'ont néanmoins permis d'avancer.

Bonnes vacances à ceux qui peuvent en prendre,

J.-Luc

Hors ligne