28

Я пытаюсь tar набор файлов в директории под названием «my_directory» и удалите оригиналы с помощью команды:

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

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

РЕДАКТИРОВАТЬ:

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

Тем не менее, мой главный побудительный момент для того, чтобы задать этот вопрос, связан с обработкой tar абсолютных путей. Поскольку вы должны указать относительный путь к файлу / файлам, которые нужно сжать, вы должны перейти в родительский каталог, чтобы правильно его смонтировать. Насколько я понимаю, использование любой команды «rm» в этой ситуации потенциально опасно. Таким образом, я надеялся упростить ситуацию, заставив tar самостоятельно выполнить удаление.

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

5 ответов5

17

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

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

так что каталог удаляется только если tar возвращает статус выхода 0

10

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

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

find /path /to /be /archive / -depth -type d -empty -exec rmdir {} \;


Обновление: вам может быть интересно прочитать это краткое обсуждение Debian,
Ошибка 424692: --remove-files жалуется, что каталоги "изменились, когда мы читаем".

5

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

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

Это было, вероятно, ошибка.

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

Но я обнаружил, что в некоторых дистрибутивах 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
1
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

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