Próbuję tar
znaleźć kolekcję plików w katalogu o nazwie „mój_katalog” i usunąć oryginały za pomocą polecenia:
tar -cvf files.tar my_directory --remove-files
Jednak usuwa tylko pojedyncze pliki w katalogu, a nie sam katalog (co określiłem w poleceniu). Czego tu brakuje?
EDYTOWAĆ:
Tak, przypuszczam, że opcja „usuń pliki” jest dość dosłowna. Chociaż ja też uważałem, że strona podręcznika jest niejasna w tym punkcie. (W Linuksie raczej nie rozróżniam zbytnio katalogów i plików i czasami zapominam, że to nie to samo). Wygląda na to, że konsensus polega na tym, że nie usuwa katalogów.
Jednak mój główny powód, by zadać to pytanie, wynika z obchodzenia się ze ścieżkami bezwzględnymi. Ponieważ musisz określić ścieżkę względną do pliku / plików, który ma zostać skompresowany, musisz zatem przejść do katalogu nadrzędnego, aby odpowiednio go spakować. Moim zdaniem użycie jakiejkolwiek komendy „rm” jest potencjalnie niebezpieczne w tej sytuacji. Tak więc miałem nadzieję uprościć rzeczy, zmuszając tar do usunięcia.
Na przykład wyobraź sobie skrypt kopii zapasowej, w którym katalog kopii zapasowej (tj. Tar) jest zawarty jako zmienna powłoki. Jeśli ta wartość zmiennej powłoki została źle wprowadzona, możliwe, że wynik może zostać usunięty z dowolnego katalogu, w którym byłeś ostatnio.
Odpowiedzi:
Brakuje części, która mówi, że
--remove-files
opcja usuwa pliki po dodaniu ich do archiwum.Możesz wykonać operację archiwizacji i usuwania plików za pomocą polecenia, takiego jak:
Aktualizacja: Być może zainteresuje Cię krótka dyskusja na temat Debiana,
Bug 424692: --remove-files narzeka, że katalogi „zmieniły się w miarę, jak je czytamy” .
źródło
-c
zmienia katalog przedtar
rozpoczęciem pracy (i jakby nie wraca, dopóki nie zostanie zrobiony)? Wydaje mi się, że usunęłoby to podkatalogi, gdyby były zawarte w archiwum (ale tego nie przetestowałem).c'
miało to coś wspólnego;'remove-files'
celowo nie usuwa katalogów.man
stron nie jest zbyt jasne, ale zakładam, że masz rację. Mimo to nie spodziewałbym się, że wspomniany katalog-c
zostanie usunięty, nawet jeślitar
usuną również katalogi. (Dla mnie byłoby to jak usunięcie bieżącego katalogu, a więc także samego archiwum, gdy nie korzystam z-c
...?) Ale jeśli-remove-files
zawsze pozostawia katalogi na swoim miejscu, to z pewnością komplikuję tutaj. ;-)--remove-files
błąd został naprawiony wtar-1.19
.Ponieważ
--remove-files
opcja usuwa tylko pliki , możesz spróbowaćtak, że katalog jest usuwany tylko wtedy, gdy
tar
zwraca status wyjścia 0źródło
rmdir
usuwa tylko puste katalogi. Pomysł polegał na usunięciu katalogu i zawartych w nim plików (pod warunkiemtar
powodzenia)--remove-files
błąd został naprawiony wtar-1.19
.Czy próbowałeś umieścić dyrektywę --remove-files po nazwie archiwum? Mi to pasuje.
źródło
--remove-files
przed lub pomy_directory
; w obu przypadkach katalog jest usuwany.--remove-files
błąd został naprawiony wtar-1.19
.na przykład
na przykład
Następnie możesz wykonać coś w stylu:
źródło
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 będzie to oznaczać także katalogi, ponieważ w unix / lnux wszystko jest plikiem, także katalogiem. (Druga interpretacja jest oczywiście również aktualna, ale nie ma sensu utrzymywanie katalogów w takim przypadku. Uważałbym to za zachowanie nieoczekiwane i mylące).
Ale odkryłem, że w niektórych wersjach gnu tar gnu tar usuwa drzewo katalogów. Kolejnym sygnałem, że trzymanie drzewa było błędem. A przynajmniej jakieś obejście, dopóki go nie naprawią.
Oto, co wypróbowałem na konsoli Ubuntu 10.04:
Jeśli chcesz zobaczyć to na swoim komputerze, wklej to do konsoli na własne ryzyko:
źródło