Я хочу, чтобы 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 и delete, но это может вызвать другой процесс, который создает проблемы с файлами, когда он пытается записать новый файл до того, как mkdir воссоздает каталог.

2 ответа2

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.

0

Мой обходной путь к этому теперь будет следующим:

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

#!/bin/bash

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .