Как найти и распаковать файлы, затем удалить их

354
R_Mat

Мне нужно найти файлы старше 30 дней, распаковать их, сжать и удалить те, которые я уже распаковал и сжал.

Я пытался выполнить что-то вроде этого, но это не похоже на его работу

find /u01/oracle/files -mtime +30 -exec tar -czvf filename_$(date +%Y-%m-%d).tar.gz /u01/oracle/files {} \; 
0

1 ответ на вопрос

0
Wüstengecko

Команда не работает, потому что findвызывает новый tarэкземпляр для каждого файла, который он находит, и каждый tarэкземпляр перезаписывает архивный файл новым, содержащим только один файл, который он получил find. Вам нужно findсобрать полный список всех файлов, а затем передать этот список в один tar:

find /u01/oracle/files -mtime +30 -print0 | tar -czvf filename_$(date +%Y-%m-%d).tar.gz --null -T /dev/stdin 

Если ваша версия tarподдерживает это, добавьте --remove-filesфлаг, чтобы удалить исходные файлы, которые были успешно сжаты.

Если ваш tarфлаг не поддерживает этот флаг, вы можете использовать этот скрипт:

#!/bin/bash -e filelist="$(mktemp)" find /u01/oracle/files -mtime +30 -print0 > "$filelist" tar -czvf "filename_$(date +%Y-%m-%d).tar.gz" --null -T "$filelist" xargs -0 rm < "$filelist" rm "$filelist" 

Использование временного файла для хранения списка вместо его регенерации предотвращает условие, когда файл может считаться недостаточно старым для tarкоманды, но к моменту создания архива прошло время, и другие файлы совпадают.

Обязательно -eвключите в шебанг (первая строка). Если вы его опустите, bash будет игнорировать ошибки команд, которые он выполняет, что может привести к потере данных.

Я получаю эту ошибку при попытке запустить последнюю R_Mat 6 лет назад 0
oracle $ find / u01 / oracle / files -mtime +60 -print0> /tmp/filelist.txt tar -czvf имя_файла _ $ (дата +% Y-% m-% d) .tar.gz --null -T / tmp /filelist.txt xargs -0 rm </tmp/filelist.txt rm /tmp/filelist.txt find: пути должны предшествовать выражению: tar Использование: find [-H] [-L] [-P] [-Olevel] [ -D помощь | дерево | поиск | статистика | ставки | opt | exec] [путь ...] [выражение] R_Mat 6 лет назад 0
@R_Mat Я улучшил и уточнил ответ об этой части, пожалуйста, смотрите отредактированный код. Wüstengecko 6 лет назад 0
#! / bin / bash -e filelist = "$ (mktemp)" find /u01/oracle/files/*.aud -mtime +30 -print0> "$ filelist" tar -czvf "имя_файла _ $ (дата +% Y- % m-% d) .tar.gz "--null -T" $ filelist "xargs -0 rm <" $ filelist "rm" $ filelist " R_Mat 6 лет назад 0
Когда я запускаю его так, как показано выше, я получаю эту ошибку R_Mat 6 лет назад 0
rm: отсутствует операнд Попробуйте 'rm --help' для получения дополнительной информации. R_Mat 6 лет назад 0
Это, вероятно, означает, что не было найдено ни одного файла. Попробуйте выполнить только команду `find` без каких-либо других действий и удалите часть` -print0> $ filelist`, чтобы она выводилась на консоль. (Вы, вероятно, хотели назвать это как `find / u01 / oracle / files -name '* .aud' -mtime ...`.) Wüstengecko 6 лет назад 0
Спасибо большое, что решили мою проблему! R_Mat 6 лет назад 0

Похожие вопросы