2016-10-29 2 views
3

J'ai un répertoire avec des fichiers qui arrivent tous les jours. Maintenant, je veux compresser ces fichiers par groupe de dates. Est-il possible de grouper/lister les fichiers qui ont atterri à la même date.Obtenir la liste des fichiers groupés par date

Supposons qu'il ya en dessous des fichiers dans un répertoire

-rw-r--r--. 1 anirban anirban 1598 Oct 14 07:19 hello.txt 
-rw-r--r--. 1 anirban anirban 1248 Oct 14 07:21 world.txt 
-rw-rw-r--. 1 anirban anirban 659758 Oct 14 11:55 a 
-rw-rw-r--. 1 anirban anirban 9121 Oct 18 07:37 b.csv 
-rw-r--r--. 1 anirban anirban  196 Oct 20 08:46 go.xls 
-rw-r--r--. 1 anirban anirban 1698 Oct 20 08:52 purge.sh 
-rw-r--r--. 1 anirban anirban 47838 Oct 21 08:05 code.java 
-rw-rw-r--. 1 anirban anirban 9446406 Oct 24 05:51 cron 
-rw-rw-r--. 1 anirban anirban 532570 Oct 24 05:57 my.txt 
drwxrwsr-x. 2 anirban anirban  67 Oct 25 05:05 look_around.py 
-rw-rw-r--. 1 anirban anirban 44525 Oct 26 17:23 failed.log 

Donc, il n'y a pas moyen de regrouper les fichiers avec tout suffixe/préfixe, puisque tous sont uniques. Maintenant, quand je vais exécuter la commande que je cherche, je vais obtenir un ensemble de lignes comme ci-dessous en fonction du groupe par dates.

[ [hello.txt world.txt a] [b.csv] [go.xls purge.sh] [code.java] ... ] and so on. 

Avec cette liste, je passe en boucle à travers et faire des archives

tar -zvcf Oct_14.tar.gz hello.txt world.txt a 
+0

Est-ce que cela vous aidera si vous êtes en mesure de placer des fichiers sur différents répertoires en fonction de leurs dates? –

+0

@SulavTimsina Si vous pouvez donner ce code .. Je peux le faire arriver à zip ces :) –

Répondre

2

Si vous avez la version GNU de la commande date, vous pouvez obtenir la date de modification d'un fichier avec le drapeau -r, ce qui peut être très utile. Par exemple, étant donné la liste de fichiers dans votre question, date +%b_%d -r hello.txt affichera Oct_14.

Avec cela, vous pourriez créer une boucle sur les fichiers, et construire des fichiers tar:

  • Si le fichier tar n'existe pas, créez-le avec un seul fichier
  • Si existe le fichier tar, ajouter le fichier à ce
  • Après la boucle, zip les fichiers tar

Comme ceci:

#!/usr/bin/env bash 

tarfiles=() 

for file; do 
    tarfile=$(date +%b_%d.tar -r "$file") 
    if ! [ -f "$tarfile" ]; then 
     tar cf "$tarfile" "$file" 
     tarfiles+=("$tarfile") 
    else 
     tar uf "$tarfile" "$file" 
    fi 
done 

for tarfile in "${tarfiles[@]}"; do 
    gzip "$tarfile" 
done 

Transmettez la liste des fichiers que vous souhaitez archiver comme paramètres de ligne de commande, par exemple si /path/to/files est le répertoire dans lequel vous souhaitez archiver les fichiers (répertorié dans votre question) et que vous enregistrez ce script dans ~/bin/tar-by-dates.sh, vous pouvez utiliser comme ceci:

cd /path/to/files 
~/bin/tar-by-dates.sh * 
+0

Il n'y a pas d'erreur dans le code au moins quand je suis en cours d'exécution rien ne se lève dans la console. Essayé avec 'set -x', pour une raison quelconque, il n'entre pas dans la boucle for. –

+0

Transmettez la liste des fichiers que vous souhaitez archiver en tant que paramètres de ligne de commande. J'ai ajouté un peu plus d'explication. – janos

+0

Écrivez un autre script autour de celui-ci, en y insérant les commandes nécessaires. Si vous avez besoin d'étapes plus détaillées sur la façon de lire la configuration d'un fichier et de l'utiliser dans un travail cron, je pense que cela appartient vraiment à une autre question. – janos

0

Créer une liste zéro seperated de (Month_Day.tar FILENAME) paires et utiliser xargs pour ajouter chaque fichier dans l'archive correspondant:

find . -maxdepth 1 -mindepth 1 -type f -printf "%Tb%Td.tar\0%f\0"|xargs -n 2 -0 tar uf