Usando versões GNU bastante recentes de date
, find
, tar
e xargs
:
Este script precisa de bash ou ksh ou zsh ou algum outro shell razoavelmente moderno que entenda substituição de processo ( <(...)
)
#!/bin/bash
today='12am today'
yesterday='12am yesterday'
# function to create a tar file for a directory but only include
# files older than "$2" but newer than "$3". Delete any files
# added to the tar archive.
#
# the tar file will be created uncompressed in the same directory
# as the directory itself. e.g. ./dir --> ./dir.tar
function tarit() {
dir="$1"
older="$2"
newer="$3"
tar cvf "$dir.tar" -C "$dir/.." --null --remove-files \
-T <(find "$dir" ! -newermt "$older" -newermt "$newer" -type f -print0)
}
# we need to export the function so we can
# run it in a bash subshell from xargs
export -f tarit
# we want to find newer files but output only the path(s)
# containing them with NULs as path separator rather than
# newlines, so use '-printf '%h#!/bin/bash
today='12am today'
yesterday='12am yesterday'
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h#!/bin/bash
today='12am today'
yesterday='12am yesterday'
# function to create a tar file for a directory but only include
# files older than "$2" but newer than "$3". Delete any files
# added to the tar archive.
#
# the tar file will be created uncompressed in the same directory
# as the directory itself. e.g. ./dir --> ./dir.tar
function tarit() {
dir="$1"
older="$2"
newer="$3"
tar cvf "$dir.tar" -C "$dir/.." --null --remove-files \
-T <(find "$dir" ! -newermt "$older" -newermt "$newer" -type f -print0)
}
# we need to export the function so we can
# run it in a bash subshell from xargs
export -f tarit
# we want to find newer files but output only the path(s)
# containing them with NULs as path separator rather than
# newlines, so use '-printf '%h#!/bin/bash
today='12am today'
yesterday='12am yesterday'
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h%pre%' |
sort -u -z |
xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files
''.
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h%pre%' |
sort -u -z | # unique sort the directory list
xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""
' |
sort -u -z |
xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files
''.
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h%pre%' |
sort -u -z | # unique sort the directory list
xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""
OBSERVE como todas as variáveis são citadas para segurança (mesmo no sub-shell bash, usando escape entre aspas), assim como usando NUL como separador (assim o script não irá quebrar se nomes de caminho e / ou nomes de arquivos contiverem mas caracteres completamente válidos, como espaços ou novas linhas). Observe também o uso de recuo e espaços extras para melhorar a legibilidade. E comentários para explicar o que está sendo feito e por quê.
Se você quiser apenas distribuir todo o diretório e excluir o próprio diretório (e todos os arquivos contidos nele), é mais simples:
%pre% Pessoalmente, acho que esses scripts são incrivelmente perigosos. Se você não tiver cuidado (por exemplo, executá-los como root com /
em vez de .
como o caminho de localização ... ou apenas executá-los no diretório /
), é possível excluir arquivos e até diretórios inteiros necessários o sistema operacional. Mesmo executá-los sob seu uid em seu diretório pessoal (ou em qualquer lugar em que você tenha acesso de gravação - o que você precisará para criar os arquivos tar de qualquer forma) pode excluir arquivos que você deseja manter.
IMO você realmente precisa repensar se realmente precisa usar a opção --remove-files
de tar
. O que você está tentando alcançar? Isso é algum tipo de intérprete? Em caso afirmativo, a exclusão de arquivos cegamente em /tmp
poderia interromper processos demorados que, por exemplo, criaram arquivos em / tmp ontem e precisam reutilizá-los hoje ... ou amanhã.
Resumindo: Aqui está um par de espingardas carregadas. Tente não se atirar no pé com eles.