Wie tar Verzeichnis und dann entfernen Sie Originale einschließlich des Verzeichnisses?

30

Ich versuche, tareine Sammlung von Dateien in einem Verzeichnis namens "Mein_Verzeichnis" zu erstellen und die Originale mit dem folgenden Befehl zu entfernen:

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

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

BEARBEITEN:

Ja, ich nehme an, die Option 'Dateien entfernen' ist ziemlich wörtlich. Obwohl ich auch die Manpage in diesem Punkt unklar fand. (Unter Linux neige ich dazu, nicht wirklich viel zwischen Verzeichnissen und Dateien zu unterscheiden und vergesse manchmal, dass sie nicht dasselbe sind). Es sieht so aus, als würde der Konsens darin bestehen, keine Verzeichnisse zu entfernen.

Mein wichtigster Anlass, diese Frage zu stellen, ist jedoch der Umgang von tar mit absoluten Pfaden. Da Sie einen relativen Pfad zu einer oder mehreren zu komprimierenden Dateien angeben müssen, müssen Sie in das übergeordnete Verzeichnis wechseln, um sie ordnungsgemäß zu tarieren. Wie ich sehe, ist es in dieser Situation potenziell gefährlich, einen 'rm'-Folgebefehl zu verwenden. Daher hoffte ich, die Dinge zu vereinfachen, indem ich Teer dazu brachte, das Entfernen selbst durchzuführen.

Stellen Sie sich beispielsweise ein Sicherungsskript vor, in dem das zu sichernde Verzeichnis (z. B. tar) als Shell-Variable enthalten ist. Wenn dieser Shell-Variablenwert falsch eingegeben wurde, können möglicherweise Dateien aus dem Verzeichnis gelöscht werden, in dem Sie sich zuletzt befanden.

Nikolaus
quelle
Nicholas, Ihr Hinweis, dass es die Gefahr erhöht, den Verzeichnisbaum in einem zusätzlichen Schritt entfernen zu müssen, ist absolut gültig. Ich denke, es sollte möglich sein, dies sicher vom Archivar erledigen zu lassen. Ich glaube auch, dass dies die Absicht der Schöpfer von GNU-Teer war, zumindest hätte es so sein sollen ;-)
mit
2
Ich habe festgestellt, dass die Option --remove-files tatsächlich das enthaltene Verzeichnis entfernt - zumindest auf einigen Plattformen / in einigen Versionen - und in meinem Fall. Könnte sein, dass in Ihrem Fall das verbleibende Verzeichnis nicht vollständig leer war, da einige Dateien nach dem Tarieren geändert wurden.
Isync
@isync Ich habe anscheinend --remove-files beim Löschen von Verzeichnissen unter Ubuntu 14.04. Außer in meinem Fall möchte ich das nicht. Haha
Bradley Odell

Antworten:

12

Es fehlt der Teil, der besagt, dass die --remove-filesOption Dateien entfernt , nachdem sie zum Archiv hinzugefügt wurden.

Sie können die Archivierungs- und Dateientfernungsoperation mit einem Befehl wie dem folgenden verfolgen:

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


Update: Sie könnten daran interessiert sein, diese kurze Debian-Diskussion über
Bug 424692 zu lesen: --remove-files beklagt, dass Verzeichnisse sich "während des Lesens geändert haben" .

nik
quelle
Vielleicht ist es tatsächlich so: -cÄndert das Verzeichnis, bevor tardie Arbeit beginnt (und die Art kommt erst wieder, wenn es fertig ist)? Ich denke, es hätte Unterverzeichnisse gelöscht, wenn diese im Archiv enthalten wären (aber ich habe das nicht getestet).
Arjan
@Arajan, ich glaube nicht, dass ' c'etwas damit zu tun hat; 'remove-files'Entfernt absichtlich keine Verzeichnisse.
Nik
Aha, ich finde die kurze Erklärung "Dateien entfernen, nachdem sie zum Archiv hinzugefügt wurden" auf den manSeiten nicht allzu klar, aber ich gehe davon aus, dass Sie Recht haben. Trotzdem würde ich nicht erwarten, dass das erwähnte Verzeichnis -centfernt wird, selbst wenn tar dies auch für das Entfernen von Verzeichnissen zutrifft. (Für mich wäre das wie das Entfernen des aktuellen Verzeichnisses, also einschließlich des Archivs selbst, wenn ich es nicht benutze -c...?) Aber wenn -remove-filesimmer Verzeichnisse vorhanden bleiben, dann erschwere ich hier sicherlich nur die Dinge. ;-)
Arjan
3
--remove-filesFehler wurde behoben in tar-1.19.
X-Yuri
19

Da die --remove-filesOption nur Dateien entfernt , können Sie es versuchen

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

Damit wird das Verzeichnis nur dann entfernt, wenn der tarExit-Status 0 zurückgibt

Pavium
quelle
9
außer dass Sie den Ausgangsstatus von Teer überprüfen sollten, bevor Sie das rm tun! Andernfalls bleibt möglicherweise kein Teerarchiv und keine Dateien übrig ...
Kim
1
Wenn Sie Verzeichnisse mit einer Ebene verwenden, ist es meiner Meinung nach sicherer, 'rmdir' anstelle von 'rm' zu verwenden, da nur ein leeres Verzeichnis entfernt wird. [Siehe Fragenbearbeitungen]
Nicholas
rmdirEntfernt aber nur leere Verzeichnisse. Die Idee war, das Verzeichnis und die darin enthaltenen Dateien zu entfernen (vorausgesetzt, dies tarist erfolgreich)
Pavium
--remove-filesFehler wurde behoben in tar-1.19.
X-Yuri
&& führt den folgenden Befehl nur aus, wenn der vorherige Befehl 0 (erfolgreich) beendet hat. Wenn es> 0 verlässt, wird der folgende Befehl nicht ausgeführt. Sie können dies auch mit || umkehren - Nur ausführen, wenn der erste Befehl fehlgeschlagen ist. Guter Weg, um schreckliche Inhalte zu überprüfen - startet diesen neu.
Kirrus
6

Haben Sie versucht, die Direktive --remove-files nach dem Archivnamen zu setzen? Für mich geht das.

tar -cvf files.tar --remove-files my_directory
Robert Grubba
quelle
1
Es ist wahrscheinlicher, dass sich das Verhalten von Teer geändert hat, seit diese Frage gestellt wurde. Für mich gibt es keinen Unterschied, ob ich --remove-filesdavor oder danach my_directorysetze. In beiden Fällen wird das Verzeichnis entfernt.
Redburn
5
--remove-filesFehler wurde behoben in tar-1.19.
X-Yuri
1
source={directory argument}

z.B

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

z.B

parent={ABSOLUTE PATH of 'my_directory'/

 

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

Dann könnten Sie etwas in folgender Weise ausführen:

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
Schälen
quelle
1

Dies war wahrscheinlich ein Fehler.

Auch das Wort "Datei" ist in diesem Fall nicht eindeutig. Aber da dies ein Befehlszeilenschalter ist, würde ich erwarten, dass dies auch Verzeichnisse bedeutet, da in Unix / Linux alles eine Datei ist, auch ein Verzeichnis. (Die andere Interpretation ist natürlich auch gültig, aber es macht keinen Sinn, in einem solchen Fall Verzeichnisse zu führen. Ich würde es als unerwartetes und verwirrendes Verhalten betrachten.)

Aber ich habe festgestellt, dass in gnu tar auf einigen Distributionen gnu tar tatsächlich den Verzeichnisbaum entfernt. Ein weiterer Hinweis darauf, dass das Halten des Baumes ein Fehler war. Oder zumindest eine Problemumgehung, bis sie es behoben haben.

Folgendes habe ich auf einer Ubuntu 10.04-Konsole ausprobiert:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir tree1 /₁                                                                                          
mit: / var / tmp $> tree1 /₁ / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 root root 4096 14.11.2011 15:40.                                                                              
drwxr-xr-x 16 root root 4096 25.02.2011 03:15 ..
drwxr-xr-x 3 mit mit 4096 14.11.2011 15:40 tree1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# WIE SIE SEHEN KÖNNEN, IST DER BAUM JETZT GEGANGEN:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 root root 4096 14.11.2011 15:41.
drwxr-xr-x 16 root root 4096 25.02.2011 03:15 ..
-rw-r - r-- 1 mit mit 159 14.11.2011 15:41 tree1.tar.gz                                                                   


mit: / var / tmp $ tar --version                                                                                             
Teer (GNU-Teer) 1.22                                                                                                           
Copyright © 2009 Free Software Foundation, Inc.

Wenn Sie es auf Ihrem Computer sehen möchten, fügen Sie es auf eigene Gefahr in eine Konsole ein:

teer - version                                                                                             
cd / var / tmp
mkdir -p tree1 / 1                                                                                          
> Baum1 / 1 / Datei1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
mit
quelle