Jeśli pliki zostały wyodrębnione w taki sposób, że znacznik czasu modyfikacji w archiwum nie jest zachowany w wyodrębnionych kopiach (ale raczej wyodrębnione pliki mają swój zwykły czas modyfikacji), wówczas właściwym sposobem na zaatakowanie tego jest czas modyfikacji. Wszystkie wyodrębnione pliki mają nowszy znacznik czasu modyfikacji niż ostatnio zmodyfikowany istniejący plik w tym katalogu.
Oto prosta sytuacja.
Załóżmy, że żaden z istniejących plików w bieżącym katalogu nie został dotknięty przez co najmniej 24 godziny. Dlatego wszystko, co zostało zmodyfikowane w ciągu ostatnich 24 godzin, jest zbędne z pliku zip.
$ find . -mtime -1 -print0 | xargs -0 rm
Znajduje to także niektóre katalogi, ale rm
pozostawia je w spokoju. Można sobie z nimi poradzić za drugim razem:
$ find . -mtime 1 -type d -print 0 | xargs -0 rmdir
Wszelkie ostatnio zmodyfikowane katalogi zostały zmodyfikowane przez zip. Jeśli rmdir
uda się je usunąć, oznacza to, że są puste. Prawdopodobnie zostały przez nią utworzone puste katalogi, które zostały dotknięte przez zip: tzn. Pochodzą z archiwum. Nie możemy być w 100% pewni. Możliwe, że zadanie rozpakowania umieściło niektóre pliki w istniejącym katalogu, który był pusty.
Jeśli find
ziarnistość 24-godzinna nie jest wystarczająca do wykonania zadania, ponieważ pliki w drzewie zostały zbyt niedawno zmodyfikowane, to następnie rozważę coś prostego: załóżmy, że zadanie rozpakowania nie umieściło niczego w istniejących podkatalogach. Oznacza to, że wszystko, co zostało rozpakowane, jest albo plikiem na najwyższym poziomie, albo nowym podkatalogiem, którego wcześniej tam nie było, a zatem nie zawiera nic poza materiałem z zip. Następnie:
# list directory in descending order of modification time
$ ls -1t > filelist # descending order of modification time
Teraz otwieramy filelist
w edytorze tekstu i określamy pierwszy wpis na liście, który nie pochodzi z zip. Usuwamy ten wpis i wszystkie pozostałe po nim. Pozostały pliki i katalogi pochodzące z zip. Najpierw sprawdzamy wizualnie, czy występują takie problemy, jak spacje w nazwach i występowanie cudzysłowów, które należy usunąć. W razie potrzeby możemy dodać cytaty wokół wszystkiego: Następujące zakłada, że używasz Vima:
:%s/.*/"&"/
Następnie połącz to wszystko w wielką linię:
:%j
Teraz wstaw rm -rf
przed nim:
Irm - rf<ESC>
Uruchom linię pod kursorem jako polecenie powłoki:
!!sh<Enter>
Zdecydowanie nie zautomatyzowałbym kroków tego zadania ze względu na ryzyko usunięcia plików, które już tam były, lub zepsucia z powodu problemów z nazwami plików.
Jeśli zamierzasz wybrać oczywistą drogę uzyskania listy ścieżek w pliku zip, a następnie przechwyć ją do pliku, przejrzyj ją bardzo uważnie i przekształć w usunięcie po przeprowadzeniu niezbędnej edycji.
lq
opcjachunzizp
, po prostu dodałem kilka klasycznych sztuczek * nix wokół jego głównej odpowiedzi.