Использование последних версий GNU date
, find
, tar
и xargs
:
Этот сценарий требует bash или ksh или zsh или другая достаточно современная оболочка, которая понимает подстановку процесса ( )
#!/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\0'`.
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h\0' |
sort -u -z | # unique sort the directory list
xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""
ЗАМЕТЬТЕ, как все переменные цитируются в целях безопасности (даже в bash вложенная оболочка, используя экранированные кавычки), а также использование NUL в качестве разделителя (чтобы сценарий не сломался, если имена пути и / или имена файлов содержат раздражающие, но полностью допустимые символы, такие как пробелы или символы новой строки). Также обратите внимание на использование отступов и дополнительных пробелов для улучшения читаемости. И комментарии, объясняющие, что делается и почему.
Если вы просто хотите заархивировать весь каталог и удалить сам каталог (и все файлы в нем), это проще:
#!/bin/bash
today='12am today'
yesterday='12am yesterday'
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h\0' |
sort -u -z |
xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files
Лично я считаю, что использовать оба этих сценария невероятно опасно. Если вы не осторожны (например, запускаете их как root с /
вместо .
в качестве пути поиска ... или просто запускаете их в каталоге /
] ), вы можете удалять файлы и даже целые каталоги, необходимые для операционной системы. Даже запуск их под вашим uid в вашем домашнем каталоге (или в любом другом месте, где у вас есть доступ для записи - в любом случае вам нужно будет создать tar-файлы), можно удалить файлы, которые вы хотите сохранить.
ИМО, вам действительно нужно переосмыслить, действительно ли вам нужно использовать параметр - remove-files
в tar
.Чего вы пытаетесь достичь? Это что, жнец какой-то? Если это так, то просто слепое удаление файлов в / tmp
может нарушить длительные процессы, которые, например, вчера создали файл (ы) в / tmp и должны повторно использовать их сегодня ... или завтра.
Короче: Вот пара заряженных ружей. Постарайтесь не выстрелить ими себе в ногу.