Właśnie rozpakowałem archiwum, które produkowało bałagan plików w moim uporządkowanym katalogu. Na przykład:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Spodziewałem się, że plik tar zostałby zorganizowany w jednym folderze (tj. myarchive/
), Ale tak nie było! Teraz mam około 190 plików i katalogów, które zostały cyfrowo zakodowane w tym, co było zorganizowanym katalogiem. Te nieopracowane pliki muszą zostać wyczyszczone.
Czy jest jakiś sposób, aby to „cofnąć” i usunąć pliki i katalogi wyodrębnione z tego archiwum?
Dzięki za doskonałe odpowiedzi poniżej. Podsumowując , oto, co działa w dwóch krokach: (1) usunięcie plików i (2) usunięcie pustej struktury katalogów w odwrotnej kolejności pakowania (aby najpierw usunąć katalog zewnętrzny):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
Jeszcze bezpieczniej, aby wyświetlić podgląd suchego polecenia, dodając echo
po nim xargs
.
xargs
(tac
zamiastsort -r
to tylko kosmetyki), ale akceptujesz odpowiedź z zastąpieniem procesu, który, jak wyjaśniłeś w komentarzach, nie pasował?xargs -d'\n'
Jeśli chcesz podsumować dla przyszłych użytkowników, podaj przełącznik w swoim poście, aby nie zostali ukąszeni spacjami w nazwach plików.-d'\n'
do tej pory nigdy nie rozumiałem konieczności , a po dalszej analizie twoja odpowiedź jest bliższa temu, czego użyłem.-d'\n'
polega na tym, że jeśli nie mówiszxargs
o dzieleniu argumentów na nowe wiersze (które karmisz), ale na spacje, plik z nazwafolder1/some file
zostanie odczytana jakofolder1/some
iname
.Odpowiedzi:
wyświetli zawartość linia po linii.
Można to przesłać
xargs
bezpośrednio, ale uwaga : usuń bardzo ostrożnie. Ty nie chcesz po prosturm -r
wszystko, cotar tf
mówi pan, ponieważ może ona zawierać katalogi, które nie były puste przed rozpakowaniem!Mógłbyś
aby najpierw usunąć wszystkie pliki, które były w archiwum, a następnie puste katalogi.
sort -r
(glennjackman zasugerowałtac
zamiastsort -r
w komentarzach do zaakceptowanej odpowiedzi, co również działa, ponieważtar
dane wyjściowe są wystarczająco regularne) jest konieczne, aby najpierw usunąć najgłębsze katalogi; inaczej przypadek, w którymdir1
zawiera pojedynczy pusty katalogdir2
pozostawidir1
pormdir
podaniu, ponieważ było nie opróżniać zanimdir2
został usunięty.To wygeneruje dużo
i
Zamknij to,
2>/dev/null
jeśli cię to denerwuje, ale wolałbym zachować jak najwięcej informacji o procesie.I nie rób tego, dopóki nie upewnisz się, że pasujesz do właściwych plików. I może spróbuj
rm -i
wszystko potwierdzić. I rób kopie zapasowe, jedz śniadanie, myj zęby itp.źródło
-d'\n'
opcjęxargs
.xargs
nie ma-d
, więc potrzebujesz wersji GNU, jeśli jesteś biedną duszą, taką jak ja.Wyświetl zawartość pliku tar w następujący sposób:
Następnie usuń te nazwy plików, iterując po tej liście:
Nadal będzie tylko lista plików, które zostaną usunięte. Wymień
echo
sięrm
, jeśli jesteś pewien, to są te, które chcesz usunąć. A może dla pewności wykonaj kopię zapasową.W drugim przejściu usuń pozostałe katalogi:
Zapobiega to usuwaniu katalogów z, jeśli już istniały wcześniej.
Kolejna fajna sztuczka autorstwa @glennjackman, która zachowuje porządek plików, poczynając od najgłębszych. Ponownie usuń
echo
po zakończeniu.Następnie może nastąpić normalne
rmdir
czyszczenie.źródło
while
pętlą nad zestawem rekordów. Właśnie się do tego przyzwyczaiłem. @ stérm -rf
może usunąć pliki, które nie były z archiwum, ale w katalogu o tej samej nazwie co jeden z archiwum. Lepiej uważaj tutaj i użyjrmdir
drugiego przejścia.rmdir
każdym poziomem zagnieżdżenia katalogów. Więc wyczyści sięsubdir1
przy pierwszym przejściu, ale odejdź,dir1
ponieważ próbował usunąć to pierwszy, gdy nie był pusty. To polecenie można wykonać raz, jeśli listę plików można posortować odwrotnie.tar tvf arch.tar | tac | xargs echo rm
(usuń echo, gdy będziesz pewien)Oto możliwość, która zabierze wyodrębnione pliki i przeniesie je do podkatalogu, czyszcząc główny folder.
Zapisz to w pliku,
fix-tar.pl
a następnie wykonaj w następujący sposób:To potwierdzi, że twoja
tar
lista jest jak moja. Powinieneś otrzymać dane wyjściowe takie jak:Jeśli to wygląda dobrze, uruchom ponownie w następujący sposób:
fixup.sh
Skrypt będzie skorupy polecenia, które będzie przenieść pliki na najwyższym poziomie i katalogów w folderze „czystej” (w tym przypadku, folder o nazwiecleanup
). Przejrzyj ten skrypt, aby potwierdzić, że wszystko jest koszerne. Jeśli tak, możesz teraz posprzątać swój bałagan za pomocą:Wolę ten rodzaj czyszczenia, ponieważ nie niszczy niczego, co nie zostało już zniszczone przez zastąpienie tą inicjałem
tar xv
.Uwaga: jeśli to początkowe wyjście suchobiegu nie wygląda dobrze, powinieneś być w stanie manipulować liczbami w dwóch
substr
wywołaniach funkcji, dopóki nie będą wyglądać poprawnie.$perms
Zmienna jest używana tylko dla sucho więc tak naprawdę tylko$dirent
potrzeby podciąg być właściwa.Jeszcze jedno: może być konieczne użycie tej
tar
opcji,--numeric-owner
jeśli nazwy użytkowników i / lub nazwy grup natar
liście powodują, że nazwy zaczynają się w nieprzewidywalnej kolumnie.źródło
Tego rodzaju (antyspołeczne) archiwum nazywa się bombą tarową ze względu na to, co robi. Gdy jedno z nich „eksploduje” na tobie, rozwiązania w innych odpowiedziach są znacznie lepsze niż to, co sugerowałbym.
Najlepszym „rozwiązaniem” jest jednak przede wszystkim zapobieganie problemowi.
Najłatwiejszym (leniwym) sposobem na zrobienie tego jest zawsze rozpakowanie archiwum tar do pustego katalogu. Jeśli zawiera katalog najwyższego poziomu, wystarczy przenieść go do żądanego miejsca docelowego. Jeśli nie, po prostu zmień nazwę katalogu roboczego (ten, który był pusty) i przenieś go do żądanej lokalizacji.
Jeśli chcesz to zrobić za pierwszym razem, możesz uruchomić tar -tvf archive-file.tar | mniej, a wyświetli zawartość archiwum, dzięki czemu można zobaczyć, jak jest on skonstruowany, a następnie zrobić wszystko, co konieczne, aby wyodrębnić go do wybranej lokalizacji na początek.
Opcja t przydaje się również, jeśli chcesz sprawdzić zawartość archiwum, aby sprawdzić, czy zawiera ono coś, czego szukasz. Jeśli tak, możesz opcjonalnie po prostu wyodrębnić żądane pliki.
źródło