Forum Programmation.shell cherche petit script car j'ai la flemme

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
3
avr.
2014

Mon souci : j'ai un dossier "projet" avec pas mal de sous dossier, et dans certains sous dossiers, il y a des liens symboliques vers un dossier de "projet/data".

le premier probleme, c'est que data fait 200Go,
le deuxieme je dois transferer ce dossier de projet sur un serveur CIFS, serveur qui ne gere evidemment pas les liens symboliques (mais gere la deduplication)

1° idée : tu remplaces les liens par un copie physique des datas, le serveur deduplique, ton dossier projet ne fera alors que 200Go+ les readmes, docs autours

mais si je ressors le projet pour l'utiliser sur un serveur qui ne gere pas les deduplications, ca ferait un dossier de 1To :(

2° idée : remplacer les liens symboliques par un vrai dossier, qui contient juste un readme.txt disant que les données se trouvent reellement dans le dossier projet/data.

seulement comme j'ai plein de sous dossiers ou potentiellement je peux avoir à mettre ce readme.txt
je souhaitais automatiser ca.

Voici une arborescence d'exemple

.
├── Data
│   └── DR1
└── R1
    ├── Data -> ../Data/
    └── SR1
        ├── Data -> ../../Data/
        ├── SSR1
        │   └── DR1 -> ../../../Data/DR1
        └── SSR2
            └── Data -> ../../../Data/

il faudrait donc generer les dossiers et fichiers suivants
R1/Data/readme
R1/SR1/Data/readme
R1/SR1/SSR1/DR1/readme
R1/SR1/SSR2/Data/readme

J'ai une amorce de solution,

find -type l sait me sortir les liens

find -type l -exec ls -l {} \; | cut -d' ' -f10-12
ou
find -type l -exec ls -l {} \; | awk '{print $9" "$10" "$11}'
savent me sortir les liens et leurs destinations

Helas, aujourd'hui j'ai la flemme, alors si, toi qui me lis, tu veux jeter un oeil à mon probleme ? ?

  • # Pareil j'ai la flemme

    Posté par  (site web personnel) . Évalué à 1.

    Disons : find path -type l -print -exec readlink {} \;

    Ou moins flemme : find path -type l | while read a ; do echo "$a ---> $(readlink $a)";done

    • [^] # Re: Pareil j'ai la flemme

      Posté par  . Évalué à 2.

      je ne cherches pas à remplacer mon find qui fait deja ce que je veux

      mais à faire un script qui
      - stock la destination du lien (../../Data/DR1 par exemple)
      - supprime le dossier qui est un lien
      - creer le dossier du meme nom mais en dur
      - creer un fichier dans ce dossier qui dit aux gens que les données se trouve dans ../../Data/DRA (pour notre exemple)

      ah ben du coup je viens d'ecrire l'algorythme.
      finalement le plus dur est fait,

      je vais faire un script qui fait ca, que je donnerais à find.

      • [^] # Re: Pareil j'ai la flemme

        Posté par  . Évalué à 4. Dernière modification le 03 avril 2014 à 18:06.

        Merci à ceux qui ont jeté un oeil, meme rapide au sujet,
        la flemme etant partie apres la "sieste", voici le petit script qui me va bien
        meme s'il peut surement etre amelioré :

        find -type l -exec ls -l {} \; | awk '{print $9}' | while read a
        do
                DEST=$(readlink $a)
                rm -v $a
                mkdir -vp $a
                echo " you will find $a in folder $DEST" > $a/data_info.txt
        done

        qui produit une arborescence comme celle là

        .
        ├── Data
        │   └── DR1
        └── R1
            ├── Data
            │   └── data_info.txt
            └── SR1
                ├── Data
                │   └── data_info.txt
                ├── SSR1
                │   └── DR1
                │       └── data_info.txt
                └── SSR2
                    └── Data
                        └── data_info.txt
        • [^] # Re: Pareil j'ai la flemme

          Posté par  . Évalué à 1.

          Salut,

          Juste un truc qui me chiffonne ;-\

          Pourquoi le -exec ls -l {} \; | awk '{print $9}' ?

          find -type l | while read a … devrait suffire, non ?

          • [^] # Re: Pareil j'ai la flemme

            Posté par  . Évalué à 2.

            tout à fait

            le script devient donc

            find -type l | while read a
            do
                    DEST=$(readlink $a)
                    rm -v $a
                    mkdir -vp $a
                    echo " you will find $a in folder $DEST" > $a/data_info.txt
            done
            • [^] # Re: Pareil j'ai la flemme

              Posté par  (site web personnel) . Évalué à 1.

              Méfiance avec les command | while read line (que je fais souvent aussi ;) ), si read se met à faire de l’interactif et à lister le dossier courant si la ligne contient une tabulation…

              Aussi méfiance avec find | command si le fichier a des caractères moisis. J’ai plusieurs fois vu des scripts àla find | cpio se vautrer parce qu’un nom de fichier contenait un alinéa ou autre caractère improbable.

              Le plus sûr est d’écrire un script tiers en blindant les paramètres de précautions.

              luser@comp:~$ cat script.sh
              #! /bin/sh
              montraitement1 "${1}"
              montraitement2 "${1}"
              luser@comp:~$ find -exec ./script.sh {} \;

              Voire, la précaution ultime si on ne passe qu’un seul nom de fichier en argument au script appelé par exec :

              montraitement3 "${@}"

              ce commentaire est sous licence cc by 4 et précédentes

      • [^] # Re: Pareil j'ai la flemme

        Posté par  . Évalué à 1.

        J'espère que ton algorithme aura le rythme dans la peau

  • # Je veux bien ....

    Posté par  . Évalué à 4.

    à 600 euros/jour.

  • # tar

    Posté par  . Évalué à 2.

    Sans avoir vérifié, je pense que tu peux utiliser tar en lui indiquant de copier les contenus pointés par les liens symboliques.

    tar --create --dereference xxxxxxx source | tar --extract xxxxxxx destination
    • [^] # Re: tar

      Posté par  . Évalué à 3.

      l'idée de la copie est à proscrire…

      le dossier Data fait 200**Go**
      et il est referencé une dizaine de fois dans les sous dossiers.

      • [^] # Re: tar

        Posté par  . Évalué à 2.

        Tu indiques devoir transférer ces données sur un truc en CIFS. Donc il faut que tu les copies à un moment.

        • [^] # Re: tar

          Posté par  . Évalué à 3.

          J'ai ce dossier A sur un serveur B
          je dois transferer ca sur le serveur C (CIFS) qui ne gere pas les liens.

          si j'ai 200Go dans le dossier Data, et qu'il est lié 10 fois dans les sous dossiers,
          ca va me faire 2To une fois dereferencé, ce que je veux absolument eviter.

          d'ou le script qui remplace les liens par un dossier avec un fichier disant ou se trouve les données censées se trouver là.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.