Rozpakowałem plik zip do niepustego folderu. Plik zip ma wiele plików i głęboką hierarchię, które połączyły się z istniejącym drzewem katalogu docelowego. Jak mogę usunąć pliki i katalogi, które zostały utworzone przez rozpakowanie bez niszczenia plików i katalogów, które już tam były? Oczywiście nadal mam plik zip, w którym się połączyłem, więc informacje tam są.
52
lq
opcjachunzizp
, po prostu dodałem kilka klasycznych sztuczek * nix wokół jego głównej odpowiedzi.foo.tds.zip
formę. Te zamki scalają się w drzewo TEXMF, co jest bardzo wygodne. Ale jeśli kiedykolwiek chcesz usunąć taki pakiet, masz do czynienia z problemem, który opisałem.Odpowiedzi:
Odpowiedź jjlin jest właściwą drogą. Chcę tylko dodać kilka opcji dla katalogów:
Usuń wszystkie wyodrębnione pliki, bez katalogów :
Usuń tylko wyodrębnione pliki i puste katalogi
Bez opcji
rmdir
usuwa tylko puste katalogi, pozostawia pliki i niepuste foldery w spokoju, dzięki czemu można je bezpiecznie uruchomić*
.Usuń wszystko , co zostało wyodrębnione, ale przed każdym usunięciem wyświetlaj monit o potwierdzenie:
-i
Flag spowodujerm
skłonić przed każdym usunięciem, można wybrać Tak lub NieUsuń wszystko , co wyodrębniono, w tym katalogi:
źródło
find
:find * -depth -type d -exec rmdir {} +
i zignoruj wszystkieDirectory not empty
wiadomości. Skrócenie tego może być legalne,find * -type d -delete
gdy-delete
opcja się włącza,-depth
ale nie sprawdziłem,-delete
czy nie usunie niepustego katalogu.find: cannot delete './foo': Directory not empty
Możesz użyć
unzip -lqq <filename.zip>
do wyświetlenia zawartości pliku zip; będzie to jednak zawierać dodatkowe informacje, które należy odfiltrować. Oto polecenie, które działa dla mnie:Te
awk
ekstrakty dowodzenia tylko nazwy plików i katalogów. Następnie wynik jest przekazywanyxargs
do usunięcia wszystkiego. Sugeruję wykonanie suchego polecenia (tzn. Pominięciexargs rm -rf
części), aby upewnić się, że wyniki są poprawne.Powyższe polecenie będzie miało problemy z obsługą ścieżek z białymi spacjami. Ta (bardziej skomplikowana) wersja powinna naprawić, że:
źródło
unzip -lqq
wymienia także katalogi zawarte w zipie. Na razie zostawiłbym wszystkie katalogi same. Jak usunąć wszystkie puste katalogi z drzewa, może być kolejnym pytaniem.grep -v '/$'
do potoku, aby pominąć usuwanie katalogów (wszystkie mają ukośnik końcowy, AFAICT).awk
od, ponieważ wydrukowanie zaledwie 4 USD nie wydrukuje pełnej ścieżki.-r
opcji rm: wydaje się, że prosi o kłopoty, szczególnie w połączeniu z tą-f
opcją.-f
W tym scenariuszu w ogóle nie skorzystałbym z tej opcji.grep -v '/$'
pomija tylko wpisy katalogu w pliku ZIP. Nadal będą zawierać wpisy, które były zwykłymi plikami w pliku ZIP, ale były wcześniej istniejącymi katalogami w folderze docelowym. Z tego powodu rozsądnie byłoby pominąć-r
Za pomocą przełącznika
-Z1
unzip wyświetli dokładnie jeden plik w wierszu (i nic więcej).W ten sposób możesz użyć
aby usunąć wszystkie pliki wyodrębnione z pliku zip.
Komenda
usunie również katalogi, ale musisz być ostrożny. Jeśli katalogi już istniały przed rozpakowaniem pliku zip, wszystkie wcześniej istniejące pliki w tych katalogach również zostaną usunięte.
Jeśli i tak chcesz ponownie rozpakować plik zip, istnieje inne podejście, które gwarantuje poradzenie sobie z dziwnymi nazwami plików.
Najpierw rozpakuj plik zip, w którym pierwotnie miałeś go rozpakować:
Teraz przejdź do katalogu, w którym przez pomyłkę rozpakowałeś pliki i wykonaj następujące polecenie:
-type f
znajduje tylko pliki (bez katalogów).%P\0
jest ścieżką względną (bezelsewhere/
), po której następuje znak null.-0
sprawia, że xargs oddziela wiersze pustymi znakami. Jest to bardziej niezawodne, ponieważ - teoretycznie - nazwy plików mogą zawierać znaki nowego wiersza.Aby poradzić sobie z pozostałymi katalogami, możesz wykonać polecenie:
-type d
znajduje tylko katalogi.-exec rmdir -p {} \;
wykonuje sięrmdir -p {}
dla każdego znalezionego katalogu.{}
to katalog, który został znaleziony, a-p
przełącznik powoduje, że rmdir usuwa również swoje puste katalogi nadrzędne.2> /dev/null
pomija komunikaty o błędach, które pojawią się podczas próby usunięcia niepustych lub wcześniej usuniętych katalogów.Powiązane strony podręcznika:
źródło
zipinfo
podręcznika man.Oto jeszcze łatwiejsze i bezpieczniejsze (myślę) rozwiązanie
Co to robi: Polecenie unzip zapisane w cudzysłowie wyświetli listę zawartości oryginalnego pliku.
zip -m użyje następnie tej listy, aby dodać dodać, że każdy do getmeoutofhere.zip i usunąć go z oryginalnego katalogu (więc teoretycznie powinien to być indential do myoriginalfile.zip.
Minusem jest to, że unzip -lqq wygeneruje dodatkowy tekst, daty, godziny, rozmiar pliku itp. Spowoduje to, że zip -m wygeneruje komunikaty o błędach, ale nie powinno to mieć wpływu (chyba że masz mało prawdopodobny przypadek pliku z tym samym imię).
Pamiętaj, że nie spowoduje to usunięcia żadnych katalogów utworzonych podczas oryginalnego rozpakowywania.
źródło
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.
Znajduje to także niektóre katalogi, ale
rm
pozostawia je w spokoju. Można sobie z nimi poradzić za drugim razem: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: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:Następnie połącz to wszystko w wielką linię:
Teraz wstaw
rm -rf
przed nim:Uruchom linię pod kursorem jako polecenie powłoki:
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.
źródło