Як націлити каталог, а потім видалити оригінали, включаючи каталог?


30

Я намагаюся tarзібрати файли в каталозі під назвою "my_directory" і видалити оригінали за допомогою команди:

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

Однак це лише видалення окремих файлів всередині каталогу, а не самого каталогу (що я вказав у команді). Що я тут пропускаю?

Редагувати:

Так, я вважаю, що варіант "видалити-файли" є досить буквальним. Хоча я теж вважав сторінку чоловіка незрозумілою з цього приводу. (У linux я, як правило, не дуже розрізняю каталоги та файли настільки сильно, і іноді забуваю, що вони не одне й те саме). Схоже, консенсус полягає в тому, що він не видаляє каталоги.

Однак, моє основне спонукальне запитання для цього питання випливає з керованості смолою абсолютних шляхів. Оскільки ви повинні вказати відносний шлях до файлу / с, який потрібно стиснути, ви повинні змінити його в батьківський каталог, щоб правильно націлити його. Як я бачу, використання будь-якої подальшої команди 'rm' потенційно небезпечно в цій ситуації. Таким чином, я сподівався спростити речі, змусивши дьоготь самостійно виконувати видалення.

Наприклад, уявіть сценарій резервного копіювання, де каталог для резервного копіювання (тобто tar) включений як змінної оболонки. Якщо це значення змінної оболонки було погано введено, можливо, в результаті можуть бути видалені файли з того каталогу, в якому ви траплялися останнім часом.


Ніколас, Ваша думка, що це додає небезпеки, що доведеться видалити дерево каталогів на додатковому кроці, абсолютно вірно. Я думаю, що архіватор повинен це зробити безпечно. Я також вважаю, що це був намір творців GNU tar, принаймні, так і повинно було бути ;-)
mit

2
Я виявив, що опція --remove-files дійсно видаляє містить dir - принаймні, на деяких платформах / у деяких версіях - і в моєму випадку. Можливо, у вашому випадку решта файлу не була повністю порожньою через те, що деякі файли були змінені після націлення.
isync

@isync Я, здається, відчуваю --remove-файли, що видаляють каталоги на Ubuntu 14.04. За винятком мого випадку, я цього не хочу. Ха-ха
Бредлі Оделл

Відповіді:


12

Вам не вистачає частини, в якій написано, що --remove-filesопція видаляє файли після додавання їх до архіву.

Ви можете слідувати операції з архіву та видалення файлів за допомогою команди "

знайти / шлях / до / бути / заархівований / -depth -тип d -empty -exec rmdir {} \;


Оновлення: Можливо, вам буде цікаво прочитати цю коротку дискусію про Debian, про
помилку 424692: --remove-файли скаржаться на те, що каталоги "змінилися під час читання" .


Можливо, це насправді: -cкаталог змін, перш ніж tarпочинає свою роботу (і вид не повертається до завершення)? Я думаю, що це видалило б підкаталоги, якби вони були включені до архіву (але я цього не перевіряв).
Ар’ян

@Arajan, я не думаю, що це c'має нічого спільного; 'remove-files'навмисно не видаляє каталоги.
nik

Ага, я вважаю, що коротке пояснення "видалити файли після додавання їх до архіву" зі manсторінок не надто зрозуміло на цьому, але я припускаю, що ти маєш рацію. Тим не менш, я не очікував би видалення зазначеного каталогу, -cнавіть якщо tar він також видаляв каталоги. (Як на мене, це було б як видалення поточного каталогу, отже, включаючи сам архів, коли не використовується -c...?) Але якщо -remove-filesзавжди залишає каталоги на місці, то я, безумовно, просто ускладнюю тут справи. ;-)
Ар’ян

3
--remove-filesвиправлено помилку tar-1.19.
x-yuri

19

Оскільки --remove-filesопція видаляє лише файли , ви можете спробувати

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

так що каталог видаляється, лише якщо tarповертає статус виходу 0


9
за винятком того, що ви повинні перевірити стан виходу смоли, перш ніж робити rm! інакше у вас може залишитися без архіву дьогтю і жодних файлів ...
Кім

1
Під час використання каталогів одного рівня, я вважаю, що більш безпечним варіантом буде використання 'rmdir', а не 'rm', оскільки воно видалить лише порожній каталог. [Див. Правки питань]
Микола

Але rmdirвидаляє лише порожні каталоги. Ідея полягала в тому, щоб видалити каталог і файли в ньому (за умови tarуспішного використання)
pavium

--remove-filesвиправлено помилку tar-1.19.
x-yuri

&& виконає таку команду, лише якщо попередня команда вийшла з 0 (успіх). Якщо він закінчується> 0, наступна команда не буде виконуватися. Ви також можете змінити це за допомогою || - запускатись лише якщо перша команда не вдалася. Хороший спосіб зробити жахливу перевірку вмісту - перезапустити цей.
Кірус

6

Чи намагалися ви поставити директиву --remove-files після назви архіву? Це працює для мене.

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

1
Більш ймовірно, що поведінка дьогтю змінилася з моменту виникнення цього питання. Для мене немає різниці в тому, --remove-filesяк ставити до або після my_directory; в обох випадках каталог видаляється.
почервоніння

5
--remove-filesвиправлено помилку tar-1.19.
x-yuri

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

1

Це, мабуть, помилка.

Також слово "файл" у цьому випадку є неоднозначним. Але оскільки це комутатор командного рядка, я б очікував, що це означатиме також каталоги, тому що в 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 корінь кореня 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 корінь кореня 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 дерево1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-файли

# ЯК ВИ МОЖЕТЕ ДИВИТИ ДРЕВО ЗАРАЗ:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 корінь кореня 4096 2011-11-14 15:41.
drwxr-xr-x 16 корінь кореня 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 --вернення                                                                                             
дьоготь (GNU tar) 1,22                                                                                                           
Copyright © 2009 Фонд вільного програмного забезпечення, Inc.

Якщо ви хочете побачити це на своєму пристрої, вставте це в консоль на власний ризик:

дьоготь --вернення                                                                                             
cd / var / tmp
mkdir -p дерево1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-файли
лс -ла
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.