[BASH] Copie un à un des fichiers d'un disque (résolu)

Applications, problèmes de configuration réseau
Répondre
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

[BASH] Copie un à un des fichiers d'un disque (résolu)

Message par Caocoa »

Salut !
J'ai récupéré un disque dur endommagé dont j'essaie d'extraire des données. Le problème ne semble pas très profond puisque tout les fichiers sont visibles avec la commande ls mais je ne peux pas copier un dossier : je suis obligé de recréer un dossier portant même nom puis de copier tout les éléments.
Je cherche donc deux choses :
  • Est-il possible de réparer la structure des données de ce disque ? Dans la mesure où la défaillance est avant tout matérielle, ça m'étonnerai.
  • Plus plausible : je cherche à construire un script qui répliquerai d'abord l'arborescence des répertoires (donc vides) puis dans un second temps copierai récursivement un à un tout les fichiers. Le problème est que j'ai du mal à trouver comment n'agir que sur les dossiers ou que sur les fichiers. Pourriez-vous m'aider s'il vous plaît ?
Bonne fin d'après-midi.
Dernière modification par Caocoa le mar. 02 août 2011, 12:00, modifié 1 fois.
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Et pour changer, la première réponse est à côté de ce que la personne demande :D

T'as regardé du côté de photorec et testdisk ? de dd (attention ça efface le disque de destination) ?
Que se passe-t-il exactement quand tu essaies de copier un dossier en ligne de commande ?

Edit : j'ai remis les messages dans l'ordre pour plus de logique
Dernière modification par oloꟼ le sam. 30 juil. 2011, 16:32, modifié 2 fois.
oloꟼ aka ewloni
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par Caocoa »

Merci de ton aide !
  • photorec, testdisk : ces logiciels sont intéressants mais je voulais essayer d'utiliser une commande « manuelle ». Je sais décrire comment je voudrais que le script évolue mais je ne sais pas encore très bien coder ça. Merci de m'avoir indiquer ces logiciels !
    De plus je ne m'intéresse qu'à récupérer ce qui est dans C:/Docs & settings et ces logiciels prennent TOUT, j'ai l'impression.
  • Code : Tout sélectionner

    [root@C40C04 ~]# mount /dev/sdb1 /media/EXT/
    mount : attention : /media/EXT/ semble être monté en lecture seule.
    [root@C40C04 ~]# cd /media/EXT/
    [root@C40C04 EXT]# cp /media/EXT/Documents\ and\ Settings/Famille/Favoris/ /home/caocoa/sav/
    cp: omission du répertoire « /media/EXT/Documents and Settings/Famille/Favoris/ »
  • Ca simplifie les choses, non ?
Dernière modification par Caocoa le sam. 30 juil. 2011, 16:33, modifié 1 fois.
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Pour recopier l'arborescence

Code : Tout sélectionner

#!/bin/bash

IN=/source/
OUT=/destination/

cd $IN
find . -type d | while read dossier; do
    mkdir -p "$OUT/$dossier"
done
Pour recopier l'arborescence puis copier les fichiers un à un :

Code : Tout sélectionner

#!/bin/bash

IN=/source/
OUT=/destination/

cd $IN
find . -type d | while read dossier; do
    mkdir -p "$OUT/$dossier"
done

find . -type f | while read fichier; do
    dossier=$OUT/`dirname "$fichier"`
    cp "$fichier" "$dossier"
done
Edit : et si tu rajoutes l'option -rv à cp ?
-r pour copier un répertoire, -v pour le passer en mode verbeux
Dernière modification par oloꟼ le sam. 30 juil. 2011, 16:43, modifié 1 fois.
oloꟼ aka ewloni
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par Caocoa »

Merci de votre aide à tout les deux.
→ Comment écrire les chemins qui comprennent des espaces ?
  • Comme ça : /media/EXT/Documents\ and\ Settings/
  • ou comme ça : "/media/EXT/Documents and Settings/"
→ Après avoir reconstituer toute l'arborescence, comment peut-on modifier le script de ewloni pour copier les fichiers (et seulement eux, pas les répertoires) à la bonne place dans la nouvelle arborescence ?

EDIT : tu m'as grillé !
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Par contre c'est normal que ton cp sur un répertoire ne fonctionne pas, je suis assez curieux d'avoir la sortie de cp -r
oloꟼ aka ewloni
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par Caocoa »

Voilà des extraits :

Code : Tout sélectionner

[root@C40C04 EXT]# cp -r /media/EXT/Documents\ and\ Settings/FAMILLE/ /home/caocoa/sav/
cp: impossible d'évaluer « /media/EXT/Documents and Settings/FAMILLE/Application Data/Adobe/Flash Player/AssetCache/EQX9NDWD »: Erreur d'entrée/sortie
cp: impossible d'accéder à « /media/EXT/Documents and Settings/FAMILLE/Application Data/dvdcss »: Erreur d'entrée/sortie
cp: impossible d'évaluer « /media/EXT/Documents and Settings/FAMILLE/Application Data/Macromedia/Flash Player/macromedia.com/support »: Erreur d'entrée/sortie
^C

Code : Tout sélectionner

[root@C40C04 EXT]# cp -rv /media/EXT/Documents\ and\ Settings/FAMILLE/ /home/caocoa/sav/
« /media/EXT/Documents and Settings/FAMILLE/ntuser.dat.LOG » -> « /home/caocoa/sav/FAMILLE/ntuser.dat.LOG »
« /media/EXT/Documents and Settings/FAMILLE/.gegl-0.0/plug-ins/Makefile » -> « /home/caocoa/sav/FAMILLE/.gegl-0.0/plug-ins/Makefile »
« /media/EXT/Documents and Settings/FAMILLE/.gimp-2.6/colorrc » -> « /home/caocoa/sav/FAMILLE/.gimp-2.6/colorrc »
« /media/EXT/Documents and Settings/FAMILLE/.gimp-2.6/controllerrc » -> « /home/caocoa/sav/FAMILLE/.gimp-2.6/controllerrc »
« /media/EXT/Documents and Settings/FAMILLE/.gimp-2.6/dockrc » -> « /home/caocoa/sav/FAMILLE/.gimp-2.6/dockrc »
« /media/EXT/Documents and Settings/FAMILLE/.gimp-2.6/gtkrc » -> « /home/caocoa/sav/FAMILLE/.gimp-2.6/gtkrc »
« /media/EXT/Documents and Settings/FAMILLE/.gimp-2.6/menurc » -> « /home/caocoa/sav/FAMILLE/.gimp-2.6/menurc »
Non, je n'ai pas conclu que ce disque était cassé parce que je n'employais pas les bonnes options (enfin, j'espère !) :)

Edition :
Quand tu mets :
dossier=$OUT/`dirname "$fichier"`
à quoi sert les deux ` ? (je ne comprends pas, c'est juste par curiosité)
Dernière modification par Caocoa le sam. 30 juil. 2011, 16:58, modifié 1 fois.
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Les erreurs d'entrées/sorties n'ont pas lieu quand tu tentes un cp directement sur les fichiers incriminés ? C'est peut-être normal que certains fichiers ne soient pas copiables, vu que ce sont peut-être des fichiers bizarres/systèmes. Je ne connais pas trop le fonctionnement de Windows.

Si j'osais ... Je te conseillerai presque de faire un cp -rf (f pour forcer) en étant root.

C'est quoi le but final ? Recopier le dossier sur un nouveau disque pour le remettre tel quel sur Windows, ou récupérer quelques fichiers/dossiers persos sans se prendre la tête avec les fichiers "systèmes" ?

Dans le deuxième il n'y a pas d'erreur ...
Dernière modification par oloꟼ le sam. 30 juil. 2011, 17:42, modifié 2 fois.
oloꟼ aka ewloni
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par Caocoa »

Moi non plus je ne connais pas trop le fonctionnement de Windows car tenter de comprendre comment GNU/Linux marche me suffit.
Quand je copie un à un les fichiers d'un répertoire, no problem. Quand je copie le répertoire en entier (avec -r…) alors il y a de forts risques que ça ne marche pas.
Le but final est de récupérer tout les fichiers contenus dans les dossiers «Mes documents» sans les copier un à un à la main mais en déléguant ça à un script.
Deuxième : d'accord, je potasserai une bible de bash aussi tôt que possible !
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Caocoa a écrit : Quand tu mets :

Code : Tout sélectionner

dossier=$OUT/`dirname "$fichier"`
à quoi sert les deux ` ? (je ne comprends pas, c'est juste par curiosité)
Ça sert à exécuter la commande dirname pour concaténer son résultat et non la commande elle-même. Ça revient au même que de mettre $()
oloꟼ aka ewloni
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par Caocoa »

C'est de la curryfication ? en tout cas c'est MEGA puissant !
Je lance le script.

Edition :
J'ai lancé le script :

Code : Tout sélectionner

[root@C40C04 EXT]# cd /home/caocoa/sav/
[root@C40C04 sav]# sh script.sh
script.sh: ligne 6 : cd: /media/EXT/Documents: Aucun fichier ou dossier de ce type
J'ai demandé un peu plus haut comment je devais écrire les répertoire avec des espaces. Par défaut le script que j'ai tenté d'exécuter est :

Code : Tout sélectionner

#!/bin/bash

IN=/media/EXT/Documents\ and\ Settings/FAMILLE/
OUT=/home/caocoa/sav/files

cd $IN
find . -type d | while read dossier; do
    mkdir -p "$OUT/$dossier"
done

find . -type f | while read fichier; do
    dossier=$OUT/`dirname "$fichier"`
    cp "$fichier" "$dossier"
done
C'est vrai que je te demande des choses très basiques et j'en suis désolé.
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

j'ai apris un mot :D

Je suis pas bien sûr d'avoir compris ce qu'est la curryfication (c'est de la récursivité sur les arguments ?), mais ça n'a pas l'air d'être le cas ici.

Là ça sert uniquement à utiliser la sortie d'une commande directement sur une autre commande. C'est un peu la même idée que le pipe |
Essaie de taper ça dans un terminal :

Code : Tout sélectionner

date
echo date
echo `date`
oloꟼ aka ewloni
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par FoolEcho »

Caocoa a écrit :Quand je copie un à un les fichiers d'un répertoire, no problem. Quand je copie le répertoire en entier (avec -r…) alors il y a de forts risques que ça ne marche pas.
Je ne vois pas pourquoi procèder de la sorte (... et c'est quelqu'un qui aime bien le bash qui vous le dit :D ).
Soit le disque est cassé, auquel cas tu ne pourras rien copier de toutes manières, ou pas tout (et là faut tenter photorec, testdisk et cie), soit il ne l'est pas, et un cp bien senti est suffisant (qu'il s'agisse de tout ou partie du disque).
D'ailleurs, dans le cas d'une copie de disque, plutôt que «cp -r» c'est:

Code : Tout sélectionner

cp -a
(conservation des permissions, dates de modification, etc. ... c'est pas ça ton problème plutôt ? )


EDIT: @ewloni: autant utiliser la clause "exec" avec un find: moins couteux que de relancer une boucle... ;-) )
Dernière modification par FoolEcho le sam. 30 juil. 2011, 17:36, modifié 1 fois.
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Caocoa a écrit : J'ai demandé un peu plus haut comment je devais écrire les répertoire avec des espaces.
Les deux sont bons.

L'erreur provient de cd, il faut écrire cd "$IN" avec les double quotes. Désolé.
FoolEcho a écrit :@ewloni: autant utiliser la clause "exec" avec un find: moins couteux que de relancer une boucle... ;-) )
je suis trèèès loin d'être un pro, mais je pense pas qu'ici ça soit très important de faire le script le plus rapide possible. Tant que ça fonctionne ... Mais c'est noté, je vais aller me documenter un peu.

Je n'ai pas mis deux fois le même script, le deuxième est plus long, il faut scroller un peu.
oloꟼ aka ewloni
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par FoolEcho »

ewloni a écrit :je suis trèèès loin d'être un pro, mais je pense pas qu'ici ça soit très important de faire le script le plus rapide possible. Tant que ça fonctionne ... Mais c'est noté, je vais aller me documenter un peu.
C'est une question d'efficacité, tu doubles le coup de la manipulation plutôt que de traiter au fur et à mesure (et si tu as des milliers de fichiers, ça fait une énorme différence à l'exécution). Quelque chose dans ce genre là:

Code : Tout sélectionner

# ce que trouve le find est récupéré dans {}:
find . -type d -exec mkdir -p "$OUT"/{} \; 
Toujours est-il que je ne vois pas l'intérêt de scripter ça... "cp -a" ne donne pas de meilleurs résultats ?
ewloni a écrit :Je n'ai pas mis deux fois le même script, le deuxième est plus long, il faut scroller un peu.
J'avais corrigé entre-temps, j'avais effectivement loupé la barre de défilement. :bouletdujour:
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque endommagé

Message par oloꟼ »

Moi non plus je vois pas l'intérêt. Je lui ai demandé s'il voulait récupérer le dossier tel quel pour le remettre sur un nouveau disque tel quel (avec les configs et tout le tintouin) ou s'il voulait juste récupérer quelques fichiers persos par-ci par-là, j'ai pas eu de réponse, j'ai répondu à la question.
oloꟼ aka ewloni
Avatar de l’utilisateur
Caocoa
yeomen
Messages : 208
Inscription : jeu. 11 nov. 2010, 16:19

Re: [BASH] Copie un à un des fichiers d'un disque (résolu)

Message par Caocoa »

Salut, ewloni !

Je répond à ta question : je veux récupérer quelques fichiers persos. Seulement il y a un problème caché derrière le « quelques » : mes fichiers persos sont triés et classés dans une arborescence que j'ai mis du temps à faire et d'autre part j'aimerai récupérer plus d'une dizaine de gigas ; comme mes fichiers sont tous de tailles très modestes, le poids total est très fragmenté donc je suis tout à fait découragé à l'idée de me lancer dans une copie manuelle et c'est donc pour ça que j'ai envie de me servir de commandes.

Tu me demandes alors pourquoi je ne veux pas utiliser cp -ra par exemple mais la question n'est pas là : bien sûr que j'en ai envie malheureusement ce disque dur a eu un problème physique (je ne sais pas lequel) et cette commande ne marche pas ! et c'est d'ailleurs pour cela que j'ai demandé dans mon premier message si quelqu'un savait comment réparer la structure des données de ce disque. Comme personne ne m'a répondu, c'est bête mais l'on ne peut rien y faire.

Mais alors pourquoi n'utiliserais-je pas testdisk ou photorec ? A cela deux raisons : pour prendre une très large estimation j'ai un peu moins de vingts gigas de dossiers très fragmentés à copier sur un disque dur rempli par 80 gigas. Il ne m'a pas semblé qu'un de ces logiciels proposait de recréer la structure des dossiers ou permettait de restreindre l'emplacement des fichiers à récupérer. Pour résumer : dans mon cas ils travailleraient mal et au bas mot quatre fois trop. Sauf option ou réglage que je n'aurai pas vu ils me semblent donc contre-indiqués.

Il me semble pour cela que le script proposé plus haut est le plus à même de même de m'être utile. Bien sûr je serai très heureux d'apprendre que je me trompe sur toute la ligne et qu'il existe un utilitaire d'une dizaine de méga proposant une interface graphique révolutionnaire capable d'exécuter en une dizaine de minutes ce que je veux mais je ne l'ai pas trouvé donc j'essaie de me débrouiller → d'aller sur ce forum.

J'ai à peu près réussi à récupérer ce que je voulais donc je vous remercie de votre aide et vous souhaite de bonnes vacances !


(Ah, c'est mon message n° 2^7+1 : snif, c'est émouvant)
Linux un noyau, Windows des pépins :mrgreen: | Manifeste pour la liberté des programmeurs, par Bill Gates.
Ma configuration
Avatar de l’utilisateur
oloꟼ
Chu Ko Nu
Messages : 381
Inscription : sam. 23 oct. 2010, 21:30

Re: [BASH] Copie un à un des fichiers d'un disque (résolu)

Message par oloꟼ »

Non je demandais pas ça en vue d'une récupération à la main, mais pour savoir s'il était important d'être sûr de bien tout récupérer, fichiers cachés/systèmes avec. Vu que c'est non, le script me paraît être une très bonne solution, on aurai même pu trier par extension ou je ne sais quoi d'autre.

Content que ça fonctionne, mais pas de vacances pour moi :mrgreen:
oloꟼ aka ewloni
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [BASH] Copie un à un des fichiers d'un disque (résolu)

Message par FoolEcho »

Caocoa a écrit :cp -ra par exemple
Redondant: cp -a, tout court.
Caocoa a écrit :et c'est d'ailleurs pour cela que j'ai demandé dans mon premier message si quelqu'un savait comment réparer la structure des données de ce disque. Comme personne ne m'a répondu, c'est bête mais l'on ne peut rien y faire.
Parce que ça dépend de ce qui est touché et comment:
Table de partition: fdisk
Système de fichiers: fsck (donc c'était peut-être de ce côté que tu pouvais chercher...)

... mais je ne vois vraiment pourquoi le script marche mieux qu'un "simple" cp... :|
«The following statement is not true. The previous statement is true.» :nage:
Répondre