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

Wie kann man ein Verzeichnis tarieren und dann die Originale einschließlich des Verzeichnisses entfernen?

Ich versuche, tar eine Sammlung von Dateien in einem Verzeichnis namens “my_directory” und die Originale mit dem Befehl zu entfernen:

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

Es werden jedoch nur die einzelnen Dateien innerhalb des Verzeichnisses entfernt und nicht das Verzeichnis selbst (was ich im Befehl angegeben habe). Was übersehe ich hier?

EDIT:

Ja, ich nehme an, die Option “remove-files” ist ziemlich wörtlich. Obwohl auch ich die Manpage in diesem Punkt unklar fand. (Unter Linux neige ich dazu, nicht so sehr zwischen Verzeichnissen und Dateien zu unterscheiden, und vergesse manchmal, dass sie nicht dasselbe sind). Es sieht so aus, als ob der Konsens ist, dass es keine Verzeichnisse entfernt.

Mein Hauptanlass, diese Frage zu stellen, rührt jedoch von Tar’s Umgang mit absoluten Pfaden her. Da Sie einen relativen Pfad zu einer zu komprimierenden Datei/zu komprimierenden Dateien angeben müssen, müssen Sie daher in das übergeordnete Verzeichnis wechseln, um es richtig zu tar. So wie ich das sehe, ist die Verwendung irgendeines nachfolgenden ‘rm’-Befehls in dieser Situation potentiell gefährlich. Daher habe ich gehofft, die Dinge zu vereinfachen, indem ich tar selbst das Entfernen erledigen lasse.

Stellen Sie sich zum Beispiel ein Backup-Skript vor, in dem das zu sichernde Verzeichnis (also tar) als Shell-Variable enthalten ist. Wenn der Wert dieser Shell-Variablen falsch eingegeben wurde, ist es möglich, dass das Ergebnis gelöschte Dateien aus dem Verzeichnis sind, in dem Sie sich zuletzt befunden haben.

Antworten (5)

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

Da die Option --remove-files nur Dateien entfernt, könnten Sie es mit

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

versuchen, so dass das Verzeichnis nur entfernt wird, wenn tar einen Exit-Status von 0 zurückgibt

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

Sie übersehen den Teil, der besagt, dass die Option --remove-files Dateien entfernt, nachdem sie dem Archiv hinzugefügt wurden.

Sie könnten die Archivierungs- und Dateientfernungsoperation mit einem Befehl wie

find /pfad/zu/be/archiviert/ -depth -type d -empty -exec rmdir {} \


Update: Sie sind vielleicht daran interessiert, diese kurze Debian-Diskussion zu lesen, Fehler 424692: –remove-files beschwert sich, dass Verzeichnisse “beim Lesen geändert wurden” .

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

Haben Sie versucht, die Direktive –remove-files hinter den Archivnamen zu setzen? Bei mir funktioniert es.

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

z.B.

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

Dann könnten Sie etwas in der Art von ausführen:

0x1&

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

Dies war wahrscheinlich ein Fehler.

Auch das Wort “Datei” ist in diesem Fall zweideutig. Da es sich aber um einen Kommandozeilenschalter handelt, würde ich erwarten, dass damit auch Verzeichnisse gemeint sind, denn in unix/lnux ist alles eine Datei, also auch ein Verzeichnis. (Die andere Interpretation ist natürlich auch gültig, aber es macht keinen Sinn, Verzeichnisse in einem solchen Fall zu behalten. Ich würde es als unerwartetes und verwirrendes Verhalten betrachten.)

Aber ich habe festgestellt, dass gnu tar auf einigen Distributionen tatsächlich den Verzeichnisbaum entfernt. Ein weiterer Hinweis darauf, dass das Beibehalten des Baums ein Fehler war. Oder zumindest ein Workaround, bis er behoben wurde.

Das habe ich auf einer ubuntu 10.04 Konsole ausprobiert:

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.

Wenn Sie es auf Ihrem Rechner sehen wollen, fügen Sie dies auf eigene Gefahr in eine Konsole ein:

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