Proces unicestwiony - przy dużej ilości plików do konwertowania

Chcę użyć takiego polecenia do podziału na połowę plików graficznych.

convert *.png -crop 50%x0% +repage piece_%d.png

Działa ono prawidłowo gdy w katalogu jest kilka plików. Jednak gdy w katalogu jest 100 plików, po chwili działania pokazuje się komunikat “Unicestwiony”.
Tak samo z innymi poleceniami, np. magick…

Da się temu jakoś zapobiec? Robienie tego po kilka plików nie wchodzi w grę, bo polecenie przekonwertowanym, czyli nowo tworzonym plikom nadaje nazwy od zera. Czyli po przerobieniu kilku plików oryginalnych musiałbym zmieniać nazwy plikom wynikowym żeby je umieścić z powrotem w jednym katalogu.

Nawiasem mówiąc, wolałbym to zrobić w jakimś programie graficznym, ale nie znalazłem takiego na Linuksa.

Próbowałbym może pętelką w bashu…
np.

cd katalog
for i in `ls *.png`; do convert $i -crop 50%x0% +repage piece_%d.png; done

A możesz napisać co to polecenia dokładnie robi (jaki efekt na tych plikach chcesz osiągnąć)?

Wydaje mi się, że dla tej komendy problem dotyczy dostępnej pamięci + mocy procesora.
Z ciekawości zrobiłem testy na małych plikach i przy ponad 1000 sztuk komenda zadziała poprawnie.
Jednak przy teście z dużymi plikami, przy kilkudziesięciu plikach, zajęta została cała pamięć RAM, znaczna część SWAP, a zajętość CPU wskoczyła powyżej 90%. Tu test przerwałem.

@napcok dobrze radzi. W pętli, takiej lub innej, nie powinno dochodzić do zapełnienie całej pamięci.

Edit:
Poniższa pętla, choć daje trochę inną numerację, robi to samo i się nie wywala.

 l=0; for i in `ls *.png`; do convert $i -crop 50%x0% +repage piece_$l.png; ((l++)); done

To ma dzielić obraz na dwie części pośrodku pionowo, czyli ma z jednego zrobić dwa: lewą i prawą stronę. Jak ma się zeskanowaną książkę tak, że na jednym obrazie jest lewa i prawa, to dzieli na pół.
To podane przez ciebie polecenie cały czas zapisuje naprzemiennie pod tymi samymi nazwami plików. Cały czas jakby na nowo tworzy piece_0 i piece_1.

Twoja pętla nie zawiesza kompa i działa na wszystkich plikach, tylko że produkuje tylko lewe strony.
Moje polecenie dzieli na lewą i prawą tylko, że nie ma pętli.

Ja po prostu zaproponowałem pętlę i podałem polecenie (pętlę) dla przykładu.
Wiadomo, że trzeba spróbować zrozumieć co się dzieje i dostosować :slight_smile:
Część:

for i in `ls *.png`;

przypisuje do zmiennej $i nazwę kolejnych plików - należy użyć też tej zmiennej $i w nazwie pliku wynikowego - wtedy będzie on za każdym razem miał inną nazwę i nie będzie nadpisywany przy każdej iteracji pętli.

Niemożliwe :wink: Sprawdź dokładniej.
Pętla generuje pliki w formacie:
piece_N-0.png (końcówka 0 to lewa strona zdjęcia)
piece_N-1.png (końcówka 1 to prawa strona zdjęcia)
gdzie N, to numer kolejnego podzielonego zdjęcia.

Potwierdzam, u mnie działa prawidłowo.

@alaskan_malamute

  1. Pierwsza myśl, jaka przyszła mi do głowy (a propos przyczyny), to dostępne zasoby: /home, /tmp i RAM. O RAM’ie wspominał już @majo; problemu z wolnym miejscem na dysku najpewniej nie ma (wyszło by już na jaw); pozostaje sprawdzić jeszcze /tmp, które jest RAM-dysk’iem i może zająć maxymalnie połowę dostępnej fizycznej pamięci operacyjnej (domyślnie).

  2. Pętla jest eleganckim i właściwym rozwiązaniem. Gdyby jednak coś nie wypaliło, to można jeszcze użyć sposobu chamskiego dość, acz skutecznego:

  • listujesz pliki do przetworzenia i wrzucasz je … do pliku;
  • na początku i końcu dodajesz odpowiednie komendy i parametry i robisz z tego skrypt;
  • nie powinno, to być trudne i czasochłonne, bo można operacje zautomatyzować;
  • rozwiązanie jest jednorazowe, bo dostosowane do konkretnej listy plików.

Rzeczywiście, teraz zadziałał. Zamieniłem najpierw nazwy plików na proste, tj. 000.jpg itd. Dodatkowo wcześniej próbowałem na plikach pbm. A teraz przekonwertowałem je najpierw wszystkie w XnConvert na jpg.

Wkleiłem polecenie z png, bo akurat taki przykład znalazłem na innej stronie i skopiowałem. No ale najważniejsze, że działa. Problem rozwiązany. Dziękuję.