Zwykle archiwizuję różne rzeczy, $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
ale czasami leniwie i po prostu robię to w dowolnym folderze, $ unzip *.zip
więc od czasu do czasu mam problemy z innymi treściami. Wymienię tutaj niektóre metody - niektóre wersje archiwalne z pewnością mają gówniane flagi, podczas gdy inne są bardziej spartańskie, bardziej interesuje mnie ta ostatnia.
Niektóre sposoby na wyłączenie archiwizacji, czy są jeszcze inne?
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;
Słabości polegają na tym, że zawiera listę*.zip
reżimów, więc musisz używać powolnego-ok
, powolnego z wieloma*.zip
dopasowaniami, a z jakiegoś powodu nie wydaje się pasować do wszystkich wyodrębnionych.Jeśli niewielka ilość wyodrębnionych plików, jeden po drugim, powolny, uciążliwy i podatny na błędy.
Kiedy chcę się upewnić, czy zawartość archiwum jest rzeczywiście folderem, czasami sprawdzam
$ unzip -l *.bsd
, czy działa, przynajmniej w wersji undip obsda.
Jeśli masz na myśli niektóre narzędzia do archiwizacji, podaj je w razie potrzeby. Uprość to - bardziej interesuje mnie SPOSOBY, w jaki sposób to robisz, niż pojedyncze narzędzie.
źródło
mkdir; unzip
rzeczy, więc nigdy nie jestem zbyt leniwy, aby to zrobić! svn.mikelward.com/svn/scripts/untarOdpowiedzi:
Wg nazwy
Możesz wygenerować listę plików w archiwum i usunąć je, ale jest to denerwująco kłopotliwe w przypadku archiwizatorów takich jak unzip lub 7z, które nie mają opcji generowania prostej listy nazw plików. Nawet w przypadku tar, zakłada się, że w nazwach plików nie ma nowych linii.
Zamiast usuwać pliki, możesz przenieść je do miejsca docelowego.
Korzystanie z BEZPIECZNIKA
Zamiast polegać na narzędziach zewnętrznych, możesz (w większości jednorożców) używać FUSE do manipulowania archiwami przy użyciu zwykłych poleceń systemu plików.
Możesz użyć Fuse-zip, aby zajrzeć do pliku zip, wyodrębnić go
cp
, wyświetlić listę jego zawartości za pomocąfind
itp.System AVFS tworzy widok całej hierarchii katalogów, w której wszystkie archiwa mają powiązany katalog (ta sama nazwa z # tacked na końcu), który wydaje się zawierać zawartość archiwum.
Według daty
Zakładając, że nie było żadnej innej aktywności w tej samej hierarchii niż ekstrakcja, możesz wyodrębnić pliki według ich ostatniej godziny . Jeśli właśnie utworzyłeś lub przeniosłeś plik zip, możesz użyć go jako odcięcia; w przeciwnym razie użyj,
ls -lctr
aby ustalić odpowiedni czas odcięcia. Jeśli chcesz mieć pewność, że nie usuniesz zamków, nie ma powodu, aby dokonywać ręcznego zatwierdzania:find
jest w stanie całkowicie je wykluczyć. Oto przykładowe polecenia używające zsh lubfind
; zauważ, że-cmin
i podstawowe-cnewer
nie są w POSIX, ale istnieją w Linux (i innych systemach z GNU find), * BSD i OSX.W GNU find, FreeBSD i OSX, innym sposobem na określenie czasu odcięcia jest utworzenie pliku i użycie go
touch
do ustawienia czasu mtime na czas odcięcia.Zamiast usuwać pliki, możesz przenieść je do miejsca docelowego. Oto sposób wyszukiwania GNU / * BSD / OSX, tworząc katalogi w miejscu docelowym w razie potrzeby.
Odpowiednik Zsh (prawie: ten odtwarza całą hierarchię katalogów, nie tylko katalogi, które będą zawierać pliki):
Ostrzeżenie, nie testowałem większości poleceń w tej odpowiedzi. Zawsze sprawdzaj listę plików przed usunięciem (
echo
najpierw uruchom , a następnie,rm
jeśli jest w porządku).źródło
Czuję się głupio, w każdym razie podrapałem się w głowę, żeby napisać ten skrypt, gdy miałem podobny problem. Użyłem
cpio
z-it
flagą, aby uzyskać listę plików; możesz użyć równoważnych poleceń dla innych archiwizatorów. Problem polega na tym, że archiwum cpio pochodzi z initrd i rozpakowałem je/
, więc wiele folderów i plików ma taką samą nazwę jak w działającym systemie. Na szczęście cpio nie nadpisało żadnego z moich istniejących plików. Używam sprawdzania czasu, aby upewnić się, że nie usuwam niczego, co istniało przed złym poleceniem.źródło
Co powiesz na karmienie listy plików w archiwum
xargs rm
?To byłoby
tar -tf tarbomb.tar | xargs rm
lubunzip --list zipbomb.zip | xargs rm
.źródło
xargs
oczekuje, że dane wejściowe zostaną podane w szczególny sposób,find
ale nie przyniosą rezultatu. Użyjxargs -I rm {}
, aby xargs zamiast tego przetwarzał jeden element w wierszu. Jaką masz implementację polecenia unzip? Mój (Debian / Ubuntu) nie ma--list
, tylko-l
, i nie tylko drukuje nazwy plików, więc potrzebne jest dodatkowe przetwarzanie.find
. 3) masz rację co do tegounzip
, że nie testowałem i wydaje się, że nie ma opcji nieposiadającego wykazu. Nie--list
na moim Ubuntu - po prostu nie testowałem.tar -t
nafind
. Ale moje inne punkty są ważne. Istnieje realne ryzyko, że podane polecenie usunie niepowiązany plik.tar -tf tarbomb.tar
wypisze nazwy plików po jednym w wierszu, abyś mógł zrobić cośtar -tf tarbomb.tar | while IFS=$'\n' read -r filename; do rm "$filename"; done
podobnego.Nie do końca to, o co prosiłeś, ale może zamiast tego użyć skryptu „rozpakuj wszystko”.
W ten sposób dane wyjściowe z każdego pliku trafiają do własnego katalogu.
źródło
Używam następującej funkcji w zsh:
Tj. Podstawienie polecenia, aby usunąć wszystkie pliki z oczyszczonego wyjścia
unzip -l
.tar tvf
może być użyty w podobny sposób.źródło