Com zsh
, usando uma matriz associativa cujas chaves são as datas e valores que a lista de arquivos delimitada por NUL modificou pela última vez nessa data:
zmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
zstat -LA date -F %b_%d +mtime $file &&
files[$date]+=$file$'find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%pzmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
zstat -LA date -F %b_%d +mtime $file &&
files[$date]+=$file$'find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%p%pre%' |
awk -v RS='%pre%' -F : -v q=\' '
function quote(s) {
gsub(q, q "\" q q, s)
return q s q
}
{
date=$1
sub(/[^:]*:/, "", $0)
files[date] = files[date] " " quote($0)
}
END {
for (date in files)
print "tar zcvf " quote(date ".tar.gz") files[date]
}'
'
}
for date (${(k)files})
echo tar zcvf $date.tar.gz ${(0)files[$date]}
' |
awk -v RS='%pre%' -F : -v q=\' '
function quote(s) {
gsub(q, q "\" q q, s)
return q s q
}
{
date=$1
sub(/[^:]*:/, "", $0)
files[date] = files[date] " " quote($0)
}
END {
for (date in files)
print "tar zcvf " quote(date ".tar.gz") files[date]
}'
'
}
for date (${(k)files})
echo tar zcvf $date.tar.gz ${(0)files[$date]}
Remova o echo
quando estiver satisfeito.
Observe que as abreviações do nome do mês ( %b
formato strftime) estarão no idioma do local atual ( Oct
em um sistema em inglês, Okt
em um alemão, etc.). Para sempre criar nomes em inglês, independentemente da localidade do usuário, force a localidade para C
com LC_ALL=C zstat...
.
Com as ferramentas do GNU, você pode fazer o equivalente com:
%pre% Canalize para sh
quando estiver feliz.