J’ai des tas de fichiers csv avec la date dans laquelle je veux mettre chaque fichier dans le fichier tar.gz. Cependant quand je fais ça. Il est resté bloqué pour un seul jour de sortie ou tar est créé avec un seul fichier pour un seul jour.
Vous faites cela un peu plus difficile que nécessaire. Si tout ce que vous voulez faire est des fichiers tar
plus anciens que "5 days ago"
, vous savez déjà comment obtenir les secondes depuis "5 days ago"
, chaque jour vaut 86400
secondes, donc soustraire i * 86400
secondes à chaque fois. dans la mesure où vous souhaitez revenir en arrière pour générer la date d’intérêt et les noms de fichiers tar, par exemple
$ d=$(date -d"5 days ago" +%s) for i in {1..30}; do dt="$(date -d@$((d - i * 86400)) +%Y%m%d)" fn="$dt.tar.gz" echo "tar -czf $fn *$dt*" done
Il utilise simplement le regroupement pour trouver tous les fichiers correspondant à la date à inclure dans chaque fichier tar quotidien, par exemple, le résultat de l’extrait de code ci-dessus est:
tar -czf 20180326.tar.gz *20180326* tar -czf 20180325.tar.gz *20180325* tar -czf 20180324.tar.gz *20180324* tar -czf 20180323.tar.gz *20180323* tar -czf 20180322.tar.gz *20180322* tar -czf 20180321.tar.gz *20180321* tar -czf 20180320.tar.gz *20180320* ... tar -czf 20180304.tar.gz *20180304* tar -czf 20180303.tar.gz *20180303* tar -czf 20180302.tar.gz *20180302* tar -czf 20180301.tar.gz *20180301* tar -czf 20180228.tar.gz *20180228* tar -czf 20180227.tar.gz *20180227* tar -czf 20180226.tar.gz *20180226* tar -czf 20180225.tar.gz *20180225*
Vous pouvez facilement adapter cette logique à votre fonction ci-dessus et est beaucoup plus efficace qu’un sortingple-tube à l’intérieur d’une substitution de commande uniquement pour générer le DIFF
pour chaque jour.
Modifier en réponse au commentaire Re: Récursif
Ci-dessus était destiné à fournir un exemple d’un moyen simple de calculer les dates souhaitées et de former le nom de fichier tar
et un simple glob de recherche pour vous permettre de rassembler les morceaux comme bon vous semble. Si vous avez des difficultés à le placer dans un formulaire qui recherchera récursivement le fichier avec une date commune, l’utilisation de find
dans une substitution de commande permet de rendre la recherche récursive en utilisant le même glob que celui indiqué ci-dessus.
La commande find
peut prendre la forme de:
tar -czf "$fn" $(find "$srchpath" -type f -name *"$dt"*) 2>/dev/null
Où find
recherchera les fichiers dans "$srchpath"
et ci-dessous pour les fichiers correspondant au “$ dt” glob. S’il y a des jours manquants dans la plage, le message d’erreur "tar: Cowardly refusing to create an empty archive"
est redirigé dans le bit-bucket.
Un court exemple de script prenant le srchpath
comme premier argument (default '.'
) Et la plage de jours avant "5 days ago"
pour rechercher (par défaut 30
) comme second argument, vous pouvez faire quelque chose comme ceci.
#!/bin/bash srchpath="${1:-.}" ## search path (default .) daterng="${2:-30}" ## date range (default 30) test -d "$srchpath" || { ## validate search path printf "error: path not found '%s'.\n" "$srchpath" exit 1 } test "$daterng" -eq "$daterng" 2>/dev/null || { ## validate range printf "error: non-integer range entered '%s'.\n" "$daternd" exit 1 } d=$(date -d"5 days ago" +%s) ## get 5 days ago for ((i = 1; i <= daterng; i++)); do ## loop over days in range dt="$(date -d@$((d - i * 86400)) +%Y%m%d)" ## get date yyyymmdd fn="$dt.tar.gz" ## form filename yyyymmdd.tar.gz echo "tar -czf $fn \$(find $srchpath -type f -name *$dt*)" ## echo command ## recursively compress matching files (no spaces allowed in name) tar -czf "$fn" $(find "$srchpath" -type f -name *"$dt"*) 2>/dev/null done
( note: les fichiers à compresser ne doivent pas comporter d’espaces. Si c’est possible, utilisez l’option -print0
pour find
et -print0
la sortie vers xargs
appelant tar
)