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

Hoe kan ik een directory tarren en dan de originelen verwijderen, inclusief de directory?

Ik probeer een verzameling bestanden in een directory genaamd ‘mijn_directory’ te tar en de originelen te verwijderen met behulp van het commando:

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

Het verwijdert echter alleen de individuele bestanden in de directory en niet de directory zelf (wat ik in het commando heb opgegeven). Wat zie ik hier over het hoofd?

EDIT:

Ja, ik neem aan dat de ‘remove-files’ optie vrij letterlijk is. Hoewel ook ik de man page op dat punt onduidelijk vond. (In linux heb ik de neiging om niet echt veel onderscheid te maken tussen mappen en bestanden, en vergeet ik soms dat ze niet hetzelfde zijn). Het lijkt erop dat de consensus is dat het geen directories verwijdert.

Echter, mijn belangrijkste reden om deze vraag te stellen komt voort uit tar’s behandeling van absolute paden. Omdat je een relatief pad moet opgeven naar een bestand of bestanden die gecomprimeerd moeten worden, moet je dus naar de bovenliggende map gaan om het goed te tarren. Zoals ik het zie is het gebruik van een of ander opvolgend ‘rm’ commando potentieel gevaarlijk in die situatie. Daarom hoopte ik de dingen te vereenvoudigen door tar zelf het verwijderen te laten doen.

Stel je bijvoorbeeld een backup script voor waarin de te backuppen directory (bijvoorbeeld tar) is opgenomen als een shell variabele. Als die shell variabele waarde slecht is ingevoerd, is het mogelijk dat het resultaat verwijderde bestanden zijn uit de directory waar je toevallig als laatste was.

Antwoorden (5)

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

Aangezien de --remove-files optie alleen bestanden verwijdert, zou je

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

kunnen proberen zodat de directory alleen wordt verwijderd als de tar een exit status van 0 teruggeeft

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

Je mist het gedeelte waarin staat dat de --remove-files optie bestanden verwijdert nadat ze aan het archief zijn toegevoegd.

Je zou het archief en de bestandsverwijdering kunnen volgen met een commando als,

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

  • *

Update: U bent misschien geïnteresseerd in het lezen van deze korte Debian discussie over, Bug 424692: –remove-files klaagt dat mappen “veranderd zijn terwijl we het lazen” .

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

Heb je geprobeerd om –remove-files directive achter archiefnaam te zetten? Bij mij werkt het.

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

b.v.

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

b.v.

 

parent={ABSOLUTE PATH of 'my_directory'/

Dan zou je iets kunnen uitvoeren in de trant van:

logFile={path to a run log that captures status messages}
1
1
1
2011-11-14 13:21:38 +0000

Dit was waarschijnlijk een bug.

Ook het woord “bestand” is dubbelzinnig in dit geval. Maar omdat dit een command line switch is zou ik verwachten dat het ook directories betekent, omdat in unix/lnux alles een bestand is, ook een directory. (De andere interpretatie is natuurlijk ook geldig, maar het heeft geen zin om in zo'n geval directories aan te houden. Ik zou het onverwacht en verwarrend gedrag vinden).

Maar ik heb ontdekt dat in gnu tar op sommige distributies gnu tar in feite de directory boom verwijdert. Nog een aanwijzing dat het behouden van de boomstructuur een bug was. Of op zijn minst een workaround totdat ze het gerepareerd hebben.

Dit is wat ik uitprobeerde op een ubuntu 10.04 console:

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.

Als je het op jouw machine wilt zien, plak dit dan in een console op eigen risico:

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