Mam folder zawierający około 320116 plików .pdb.gz. Chcę je wszystkie zdekompresować. Jeśli użyję gunzip * .gz, pojawia się błąd, tzn. Lista argumentów jest za długa. Folder ma około 2 GB. Proszę o odpowiednią sugestię.
Jeśli będziesz musiał długo pracować nad tą strukturą katalogów, podziel ten katalog na wiele. Na przykład na podstawie czasu modyfikacji plików lub nazwy pliku.
dan
Tak, muszę pracować długoterminowo. zostały wyodrębnione teraz Chcę podzielić i podzielić je na trzy foldery na podstawie ich nazw. Czy można to zrobić za pomocą skryptu powłoki?
Lily Sharpton,
Sugeruję, abyś tam poszukał podobnych pytań. Jeśli nie znajdziesz takiego, który odpowiada Twoim potrzebom, zadaj nowe pytanie.
dan
Odpowiedzi:
25
find .-name '*.pdb.gz'-exec gunzip {}+
-exec gunzip {} +zapewni gunzipwiele, ale nie za dużo nazw plików w wierszu poleceń. Jest to bardziej wydajne niż w przypadku, -exec gunzip {} \;gdy rozpoczyna się nowy gunzipproces dla każdego pliku.
Zauważ, że „+” to GNUism i dlatego nie będzie działać na systemach innych niż GNU, takich jak * BSD.
Przywróć Monikę - M. Schröder
3
Późniejsze wersje BSD findumożliwiają zapis „+”. Zobacz na przykład stronę podręcznika użytkownika finddla BSD 10.1 . Dotyczy to również OS X (10.9 i przynajmniej później, może wcześniej).
plazma
7
Ilekroć pojawią się błędy „zbyt długiej listy argumentów”, możesz obejść ją, wielokrotnie wywołując żądane polecenie, za każdym razem z podzbiorem argumentów, których chcesz użyć. xargsto narzędzie, które pomaga to zrobić automatycznie.
find .-type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
czy to nie ma takiej samej nieefektywności jak -execdir gunzip "{}" \;np. że xargs wywoła gunzip osobno dla każdego pliku? To jest moje czytanie strony man.
gogoud
5
Nie, xargsumieści tyle nazw plików, ile zmieści się w gunziplinii poleceń. Spróbuj! echo a b c d e f | xargs echowywołuje tylko echoraz ze wszystkimi 6 argumentami, więc widzisz jeden wiersz wyniku (chociaż całkiem bezużyteczne polecenie do wykonania !!!!), a jeśli wymusisz podanie xargstylko 3 argumentów na wywołanie polecenia za pomocą, echo a b c d e f | xargs -n 3 echowtedy otrzymasz 2 wiersze wyniku .
Celada,
4
Kolejną zaletą używania xargsjest to, że z tą -Popcją możesz uruchamiać wiele gunzipprocesów równolegle, co (w zależności od dokładnych parametrów twojego systemu) może przebiegać szybciej.
psmears
dzięki za wskaźnik do -P@psmears. Teraz też się czegoś nauczyłem!
Celada,
1
Myślę, że to powinno działać, przekazuje ścieżkę / nazwę każdego pliku osobno do gunzip w celu przetworzenia:
Spowoduje to uruchomienie gunzip raz na plik. Zobacz odpowiedź John1024 na nieco inny sposób, który pozwala uniknąć tej nieefektywności.
Celada,
@Celada To było celowe; obawiałem się, że użycie + może ponownie prowadzić do komunikatu o błędzie z powodu przeciążenia gunzip. Jeśli metoda John1024 działa, jest technicznie bardziej wydajna, ale moja powinna działać, jeśli jego nie.
gogoud
1
findz +i xargssą wyraźnie projektowane z myślą o tym właśnie problemie. Zawsze podają jak najwięcej argumentów, nie przekraczając limitu systemu operacyjnego. Bo, nawiasem mówiąc, jest to limit systemu operacyjnego, z którym nie ma nic wspólnego gunzip.
Celada
1
@Celada ok, dziękuję za te informacje, więc przypuszczalnie z „+” gunzip można wywołać więcej niż jeden raz, ale mniej niż 320 000 razy?
To będzie wykonywane gunzipraz na plik. Zobacz odpowiedź John1024 na nieco inny sposób, który pozwala uniknąć tej nieefektywności.
Celada,
Pamiętaj, aby uciec z * w * .gz ...
user253751
1
Jeśli masz maszynę wielordzeniową, prawdopodobnie zauważysz, że korzystanie z niej gunzipnie zmaksymalizuje możliwości twojego komputera. W tym celu musisz uruchomić wiele gunzips równolegle. Śledzenie, które operacje są wykonywane w tym, który terminal jest ręcznie, jest uciążliwe, ale możesz to łatwo zrobić z GNU równoległym:
Odpowiedzi:
-exec gunzip {} +
zapewnigunzip
wiele, ale nie za dużo nazw plików w wierszu poleceń. Jest to bardziej wydajne niż w przypadku,-exec gunzip {} \;
gdy rozpoczyna się nowygunzip
proces dla każdego pliku.źródło
find
, mniejgunzip
!find
umożliwiają zapis „+”. Zobacz na przykład stronę podręcznika użytkownikafind
dla BSD 10.1 . Dotyczy to również OS X (10.9 i przynajmniej później, może wcześniej).Ilekroć pojawią się błędy „zbyt długiej listy argumentów”, możesz obejść ją, wielokrotnie wywołując żądane polecenie, za każdym razem z podzbiorem argumentów, których chcesz użyć.
xargs
to narzędzie, które pomaga to zrobić automatycznie.źródło
-execdir gunzip "{}" \;
np. że xargs wywoła gunzip osobno dla każdego pliku? To jest moje czytanie strony man.xargs
umieści tyle nazw plików, ile zmieści się wgunzip
linii poleceń. Spróbuj!echo a b c d e f | xargs echo
wywołuje tylkoecho
raz ze wszystkimi 6 argumentami, więc widzisz jeden wiersz wyniku (chociaż całkiem bezużyteczne polecenie do wykonania !!!!), a jeśli wymusisz podaniexargs
tylko 3 argumentów na wywołanie polecenia za pomocą,echo a b c d e f | xargs -n 3 echo
wtedy otrzymasz 2 wiersze wyniku .xargs
jest to, że z tą-P
opcją możesz uruchamiać wielegunzip
procesów równolegle, co (w zależności od dokładnych parametrów twojego systemu) może przebiegać szybciej.-P
@psmears. Teraz też się czegoś nauczyłem!Myślę, że to powinno działać, przekazuje ścieżkę / nazwę każdego pliku osobno do gunzip w celu przetworzenia:
źródło
find
z+
ixargs
są wyraźnie projektowane z myślą o tym właśnie problemie. Zawsze podają jak najwięcej argumentów, nie przekraczając limitu systemu operacyjnego. Bo, nawiasem mówiąc, jest to limit systemu operacyjnego, z którym nie ma nic wspólnegogunzip
.Wypróbuj w ten sposób:
źródło
gunzip
raz na plik. Zobacz odpowiedź John1024 na nieco inny sposób, który pozwala uniknąć tej nieefektywności.Jeśli masz maszynę wielordzeniową, prawdopodobnie zauważysz, że korzystanie z niej
gunzip
nie zmaksymalizuje możliwości twojego komputera. W tym celu musisz uruchomić wielegunzip
s równolegle. Śledzenie, które operacje są wykonywane w tym, który terminal jest ręcznie, jest uciążliwe, ale możesz to łatwo zrobić z GNU równoległym:źródło
parallel
jest za długa?find
to zbyt długo?find
wierszu poleceń.-name
Nie jest do
find
tego konieczne użycie , ponieważ nie wspomniano o podfolderach. Co musisz zrobić, to:źródło
find
, jeśli nie chcą tarło 320116gunzip
procesów, tak jak to robi pętlę.