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ę.
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ę.
Odpowiedzi:
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.
find, mniej gunzip!
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).
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
-execdir gunzip "{}" \;np. że xargs wywoła gunzip osobno dla każdego pliku? To jest moje czytanie strony man.
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 .
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.
-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:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
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.
Wypróbuj w ten sposób:
find . -name '*.gz' -exec gunzip {} \;
gunzipraz 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 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:
find . -name "*.gz" | parallel -X gunzip {}
paralleljest za długa?
findto zbyt długo?
findwierszu poleceń.
-name
Nie jest do findtego konieczne użycie , ponieważ nie wspomniano o podfolderach. Co musisz zrobić, to:
for f in *.gz;do gunzip $f;done
find, jeśli nie chcą tarło 320116 gunzipprocesów, tak jak to robi pętlę.