Tar a eu une boucle pour

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 

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 )