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

Jak wykonać tarowanie katalogu, a następnie usunąć oryginały z tego katalogu?

Próbuję tar kolekcję plików w katalogu o nazwie ‘my_directory’ i usunąć oryginały za pomocą polecenia:

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

Jednak usuwa to tylko poszczególne pliki wewnątrz katalogu, a nie sam katalog (który jest tym, co określiłem w poleceniu). Czego mi tu brakuje?

EDIT:

Tak, przypuszczam, że opcja ‘remove-files’ jest dość dosłowna. Chociaż ja również znalazłem stronę man niejasną w tym punkcie. (W linuxie mam tendencję do nie rozróżniania katalogów i plików tak bardzo, i zapominam czasem, że nie są one tym samym). Wygląda na to, że konsensus jest taki, że nie usuwa katalogów.

Jednakże, moim głównym powodem do zadania tego pytania jest obsługa przez tar'a ścieżek bezwzględnych. Ponieważ musisz podać względną ścieżkę do pliku/plików, które mają być skompresowane, musisz zmienić katalog na nadrzędny, aby tarował je poprawnie. Jak widzę, użycie jakiejkolwiek komendy ‘rm’ jest potencjalnie niebezpieczne w tej sytuacji. Dlatego miałem nadzieję uprościć sprawę, sprawiając, że tar sam wykona usunięcie.

Na przykład, wyobraźmy sobie skrypt kopii zapasowej, w którym katalog do backupu (tj. tar) jest dołączony jako zmienna powłoki. Jeśli ta wartość zmiennej powłoki została źle wpisana, możliwe, że wynikiem mogą być usunięte pliki z katalogu, w którym byłeś ostatnio.

Odpowiedzi (5)

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

Ponieważ opcja --remove-files tylko usuwa pliki, możesz spróbować

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

tak, że katalog jest usuwany tylko wtedy, gdy tar zwróci status wyjścia 0

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

Brakuje ci części, która mówi, że opcja --remove-files usuwa pliki po dodaniu ich do archiwum.

Mógłbyś śledzić operację archiwizacji i usuwania plików za pomocą polecenia takiego jak,

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


Aktualizacja: Możesz być zainteresowany przeczytaniem tej krótkiej dyskusji Debiana na temat, Bug 424692: –remove-files complains that directories “changed as we read it” .

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

Czy próbowałeś umieścić dyrektywę –remove-files po nazwie archiwum? To działa dla mnie.

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

np.

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

np.

parent={ABSOLUTE PATH of 'my_directory'/

 

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

Wtedy można by wykonać coś w stylu:

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
1
1
2011-11-14 13:21:38 +0000

To był prawdopodobnie błąd.

Również słowo “plik” jest w tym przypadku niejednoznaczne. Ale ponieważ jest to przełącznik wiersza poleceń, spodziewałbym się, że oznacza także katalogi, ponieważ w unix/lnux wszystko jest plikiem, także katalogiem. (Inna interpretacja jest oczywiście również ważna, ale nie ma sensu trzymać katalogów w takim przypadku. Uznałbym to za nieoczekiwane i mylące zachowanie).

Ale zauważyłem, że w gnu tar na niektórych dystrybucjach gnu tar faktycznie usuwa drzewo katalogów. Kolejna wskazówka, że utrzymywanie drzewa było błędem. Albo przynajmniej jakimś obejściem, dopóki go nie naprawią.

To jest to, co wypróbowałem na konsoli 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.

Jeśli chcesz to zobaczyć na swojej maszynie, wklej to do konsoli na własne ryzyko:

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