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

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

Я хочу, чтобы tar упаковал полный каталог

tar cvjf dir.tbz dir

Но сделайте так, чтобы он удалил все файлы.

tar cvjf dir.tbz dir --remove-files

Однако это также удаляет ./dir. Поэтому я попытался перейти в каталог перед упаковкой

tar cvjf dir.tbz --remove-files -C dir .

Но это все равно удаляет ./dir... что для меня не имеет никакого смысла, потому что почему tar должен удалять сам рабочий каталог? Разве я не могу упаковать полный каталог и удалить файлы после упаковки, не удаляя весь каталог?

У меня запущен процесс, который постоянно создает файлы в ./dir, и я хочу упаковать все файлы каждый час, а затем удалить те, которые упакованы. Я мог бы mkdir после tar и удалить, но это может вызвать трудности у другого процесса, который создает файлы, когда он попытается записать новый файл до того, как mkdir пересоздаст каталог.

решение1

Вы можете попробовать что-то вроде этого:

find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz

Это немного сложнее, чем ваша текущая команда, но работает, и я не думаю, что у нее возникнут какие-либо проблемы с гонкой (при условии, что файл не будет записываться несколько раз с перерывами более минуты).

Команда findнаходит все файлы в , dirкоторым не менее одной минуты (то есть в которые в данный момент не ведется запись). Затем этот список передается в xargs, который добавляет каждый по очереди в dir.tarфайл. После успешного добавления файла в файл tar оригинал удаляется. Выполнение этого по одному позволяет избежать проблем со слишком длинными командными строками, если у вас много файлов. Наконец, вы можете сжать и переименовать файл tar.

решение2

Теперь я бы предпринял следующие действия для решения этой проблемы:

Я пишу скрипт, который переходит в каталог и tar-архивирует все с помощью ./*, а затем удаляет. Я просто надеялся, что -C сделает то же самое, чтобы я мог иметь это в одной командной строке, но этого не происходит.

#!/bin/bash

cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files

Должно сработать.

Связанный контент