Forum Programmation.shell espace dans une chaine et commande tar

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
18
sept.
2016

bonsoir et bonne semaine

j'ai un probleme ce dimanche.

ddate=`stat --printf '%y#%n\n' $a/*$t* | sort | cut -d "." -f 1 | sed -n '1 p'`
g="--newer-mtime=\"`echo ${ddate}`\""
nom="backup"
marche="oui"

if [ "$marche" = "oui" ] ; then 
    archive="$a/${nom}_$(date +%Y-%m%B-%d_%H%M%S).tar.gz"
    tar -zcvf $archive -X /home/patrick/backupExclude $g --exclude=/proc --exclude=/dev  -p -P ${s//:/ }
fi

et ca me donne la commande

tar -zcvf dossier/archive.tar.gz  -X /home/patrick/backupExclude '--newer-mtime="2016-09-18' '00:26:27"' --exclude=/proc --exclude=/dev -p -P /media/seagate500GO/patrick/Photos_triees/2016/

la commande stat m'envoie
2016-09-18 00:26:27

>  :~$ bash --version 
    GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>

merci de me résoudre ce soucis

  • # Formatage

    Posté par  . Évalué à 4.

    Bonjour,

    Utilise la balise markdown qui va bien pour poster ton code ici (https://linuxfr.org/wiki/aide-edition#code) parce que là c’est illisible…

    g="--newer-mtime=\"echo ${ddate}\""

    Pourquoi pas simplement : g="--newer-time=\"${ddate})\"" ?
    ```

    • [^] # Re: Formatage

      Posté par  . Évalué à 1.

      j'ai fais comme vous dites

      g="--newer-mtime=\"${ddate}\""
      tar -zcvf archiveblabla.tar.gz $g

      et ca marche lorsque je fais

      g="--newer-mtime="

      et dans la commande

      tar -zcvf archiveblabla.tar.gz $g"$ddate"

      et là ca marche.

  • # Hop

    Posté par  . Évalué à 4.

    merci de me résoudre ce soucis

    Oui patron.

  • # en passant

    Posté par  . Évalué à 3.

    En règle générale, ça serait vraiment bien de poster les sorties correspondant effectivement au script décrit. Là, vu le script, dans la ligne générée, archive.tar.gz devrait plutôt ressembler à archive_2016-09September-18_002627 (curieux format de date). D'autre part,

    '--newer-mtime="2016-09-18' '00:26:27"'

    ne correspond pas non plus à $g tel que g est défini.

    Sinon, le calcul de ddate peut être légèrement amélioré.
    On peut identifier l'entrée qu'on veut garder avec ls avant de transmettre le résultat à stat (du coup, stat ne traite qu'un seul fichier au lieu d'une liste).
    Pour garder la première ligne d'une liste, sed -n '1 p' fonctionne, mais parcourt toute la liste. Il vaut mieux utiliser head (ce qui améliore également la lisibilité).
    Sur le plan cosmétique, je préfère évaluer avec $(…) plutôt que \'…\', mais là, c'est plus une question de préférence personnelle.

    Bref, j'écrirais plutôt :

    ddate=$(stat --printf '%y#%n\n' $(ls -t $a/*$t* | head -1) | cut -d "." -f 1)

    Au final, le nombre de commande lancées est le même, mais seul ls travaille sur une liste, les autres commandes ne traitent qu'une seule entrée. Sur des répertoires avec de nombreux fichiers, la différence en temps d'exécution peut être significative.

    • [^] # Re: en passant

      Posté par  . Évalué à 2. Dernière modification le 20 septembre 2016 à 23:33.

      En fait on peut carrément se passer de stat:

      --newer-mtime=DATE
                    Work on files whose data changed after the DATE.  If DATE starts
                    with / or . it is taken to be a file name;  the  mtime  of  that
                    file is used as the date.
      

      Donc tout simplement tar --newer-mtime="./`ls $a/*$t* -t | tail -1`" Si $a est absolu, alors il faut omettre le ./ évidemment.

      Remarque aussi en passant, le double encadrement avec des guillemets est plus que probablement la source de l'erreur originale. Les guillemets intérieurs n'ont aucune raison d'être, tar ne s'attend probablement pas à parser une date qui commence et qui fini par des guillemets. Les premiers guillemets empêchent le shell de séparer la date au niveau de l'espace lorsqu'il construit la liste d'arguments à tar.

Suivre le flux des commentaires

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