Se você tivesse acesso ao GNU date
, isso seria muito mais fácil. Como é, seria mais simples usar uma linguagem mais sofisticada. Por exemplo, Perl:
#!/usr/bin/perl -w
use strict;
use POSIX qw(strftime);
my $targetDir = $ARGV[0] || ".";
my %tarFiles;
open(my $input, '-|', "find \"$targetDir\" -type f -name '*.log'");
while (<$input>) {
# remove trailing newlines
chomp;
## Get the file name
my $file = $_;
# Open it as a file handle for stat()
open(my $fh, '<', "$file") or die;
# Get the file's stats
my @stats = stat($fh);
close($fh);
# modification time
my $mtime = $stats[9];
# Convert to YYYY-MM and build the tar file name
my $tarfile = strftime "%Y-%m_archive.tar.gz", localtime($mtime);
# Add to the list of files for this tar file
push @{$tarFiles{$tarfile}}, qq("$file");
}
for my $tarFile (keys(%tarFiles)) {
# Build the command that creates the tar file
my $tarCom = "tar cvzf $tarFile @{$tarFiles{$tarFile}}";
print "COMMAND: $tarCom\n";
# Uncomment this line to run the command
# system("$tarCom")
}
Salve o script como makeTars.pl
(ou o que quiser) em algum lugar no seu $PATH
, torne-o executável ( chmod +x /path/to/makeTars.pl
) e execute assim:
makeTars.pl /path/to/target/dir
Por exemplo:
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Dec 30 00:00 file1.log
-rw-r--r-- 1 terdon terdon 0 Dec 31 00:00 file2.log
-rw-r--r-- 1 terdon terdon 0 Jan 1 2016 file3.log
-rw-r--r-- 1 terdon terdon 0 Jan 2 2016 file4.log
-rw-r--r-- 1 terdon terdon 0 Jan 3 2016 file5.log
-rw-r--r-- 1 terdon terdon 0 Jan 3 2016 'file5 with spaces.log'
$ makeTars.pl .
COMMAND: tar cvzf 2017-02_archive.tar.gz "."
COMMAND: tar cvzf 2016-12_archive.tar.gz "./file2.log" "./file1.log"
COMMAND: tar cvzf 2016-01_archive.tar.gz "./file5 with spaces.log" "./file5.log" "./file4.log" "./file3.log"
Quando estiver satisfeito com o que você deseja, descomente a última linha ( system("$tarCom")
) para criar os arquivos tar.
Observe que isso será interrompido se os nomes dos arquivos contiverem novas linhas, mas espero que isso não seja um problema com os arquivos de log.