2010-01-17 11:25:07 +0000 2010-01-17 11:25:07 +0000
32
32
Advertisement

Как сделать tar-директорию, а затем удалить оригиналы, включая каталог?

Advertisement

Я пытаюсь получить tar коллекцию файлов в каталоге под названием ‘my_directory’ и удалить оригиналы с помощью команды:

tar -cvf files.tar my_directory --remove-files

Однако это удаление только отдельных файлов внутри каталога, а не самого каталога (что я и указал в команде). Чего мне здесь не хватает?

EDIT:

Да, я полагаю, что опция ‘remove-files’ довольно буквальна. Хотя я тоже нашел man-страницу неясной в этом вопросе. (В linux я склонен не так сильно различать каталоги и файлы, и иногда забываю, что это не одно и то же). Похоже, что консенсус заключается в том, что он не удаляет каталоги.

Однако, мой главный побудительный мотив для задания этого вопроса связан с тем, что tar работает с абсолютными путями. Т.к. вы должны указать относительный путь к файлу/s, который должен быть сжат, то вы должны изменить его в родительском каталоге, чтобы правильно tar. Как я вижу, использование любой команды ‘rm’ потенциально опасно в этой ситуации. Поэтому я надеялся упростить ситуацию, заставив tar сам сделать удаление.

Например, представьте скрипт резервного копирования, в котором каталог для резервного копирования (т.е. tar) включается в качестве переменной оболочки. Если значение этой переменной в оболочке было введено неправильно, то возможно, что в результате могут быть удалены файлы из того каталога, в котором вы оказались последним.

Advertisement
Advertisement

Ответы (5)

19
19
19
2010-01-17 11:58:18 +0000

Поскольку опция --remove-files только удаляет файлы, можно попробовать

tar -cvf files.tar my_directory && rm -R my_directory

так, чтобы каталог удалялся только в том случае, если tar вернет статус выхода 0

12
12
12
2010-01-17 11:42:11 +0000

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

Вы можете следовать за операцией архивации и удаления файлов с помощью команды типа

найти /path/to/be/archived/ -depth -type d -empty -exec rmdir {}. \;


Обновление: Возможно, вам будет интересно прочитать эту короткую дискуссию о Debian, Bug 424692: –remove-файлы жалуются на то, что каталоги “изменились так, как мы читали”. .

7
Advertisement
7
7
2014-11-12 10:15:09 +0000
Advertisement

Пытались ли вы поместить директиву –remove-files после имени архива? Это работает на меня.

tar -cvf files.tar --remove-files my_directory
1
1
1
2010-10-04 19:58:41 +0000
source={directory argument}

, например,

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

, например,

 

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

Тогда вы могли бы выполнить что-нибудь в соответствии с этим:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [$? != 0]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi
1
Advertisement
1
1
2011-11-14 13:21:38 +0000
Advertisement

Наверное, это был жучок.

Также слово “файл” в этом случае является амбициозным. Но поскольку это переключатель командной строки, я ожидаю, что он будет означать также каталоги, потому что в unix/lnux все является файлом, а также каталогом. (Другая интерпретация, конечно, тоже верна, но в этом случае нет смысла хранить каталоги. Я бы посчитал это неожиданным и запутанным поведением).

Но я обнаружил, что в gnu tar на некоторых дистрибутивах gnu tar фактически удаляет дерево каталогов. Другим признаком того, что сохранение дерева было ошибкой. Или, по крайней мере, какой-то обходной путь, пока его не исправят.

Это то, что я пробовал на консоли ubuntu 10.04:

mit:/var/tmp$ mkdir tree1 mit:/var/tmp$ mkdir tree1/sub1 mit:/var/tmp$ \> tree1/sub1/file1 mit:/var/tmp$ ls -la drwxrwxrwt 4 root root 4096 2011-11-14 15:40 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1 mit:/var/tmp$ tar -czf tree1.tar.gz tree1/ --remove-files # AS YOU CAN SEE THE TREE IS GONE NOW: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. -rw-r--r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz mit:/var/tmp$ tar --version tar (GNU tar) 1.22 Copyright © 2009 Free Software Foundation, Inc.

Если вы хотите увидеть это на своей машине, вставьте это в консоль на свой страх и риск:

tar --version cd /var/tmp mkdir -p tree1/sub1 \> tree1/sub1/file1 tar -czf tree1.tar.gz tree1/ --remove-files ls -la
Advertisement

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

6
10
5
37
7
Advertisement