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 gunzip
wiele, ale nie za dużo nazw plików w wierszu poleceń. Jest to bardziej wydajne niż w przypadku, -exec gunzip {} \;
gdy rozpoczyna się nowy gunzip
proces dla każdego pliku.
find
, mniej gunzip
!
find
umożliwiają zapis „+”. Zobacz na przykład stronę podręcznika użytkownika find
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.
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.
xargs
umieści tyle nazw plików, ile zmieści się w gunzip
linii poleceń. Spróbuj! echo a b c d e f | xargs echo
wywołuje tylko echo
raz ze wszystkimi 6 argumentami, więc widzisz jeden wiersz wyniku (chociaż całkiem bezużyteczne polecenie do wykonania !!!!), a jeśli wymusisz podanie xargs
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ć wiele gunzip
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:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
find
z +
i xargs
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ólnego gunzip
.
Wypróbuj w ten sposób:
find . -name '*.gz' -exec gunzip {} \;
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ć wiele gunzip
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:
find . -name "*.gz" | parallel -X gunzip {}
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:
for f in *.gz;do gunzip $f;done
find
, jeśli nie chcą tarło 320116 gunzip
procesów, tak jak to robi pętlę.