Java exec i kompresja zip

0

Witam serdecznie

mam taką komende
String exec = "gzip" + " -r" + file.getAbsolutePath() ;
Process p = Runtime.getRuntime().exec(exec);

i wszystko działa dobrze czyli jesli podaje mu file jako katalog to kompresuje wszystkie pliki w tym katalogu i umieszcza obok pliku jego skompresowaną wersje .. wszystko działa ok i byłoby super tylko, że rozszerzenie muszę mieć zip czyli muszę użyć polecenia zim a nie gzip ??

tylko że zip nie działa tak jak gzip : zip -r /katalog/plik.zip /katalog/plik
utworzy mi zipa ale nie tak jak gzip ??

po prostu gzip spakuje mi wszystkie pliki w danym katalogu a zip tworzy tylko jedne archiwum ??
istnieje jakies rozwiązanie ??

Muszę uzystać taki efekt przy użycio exec : funkcja otrzymuje file jako directory
i sprawdza podkatalogi jeśli w danym podkatalogu jest plik to tworzy archiwum zip

0

Mówiąc po polsku:

  • kontener .gz przechowuje bezpośrednio tylko jeden plik, więc opcja -r tworzy plik .gz dla każdego pliku źródłowego,
  • kontener .zip może przechować bezpośrednio całą strukturę katalogów, więc wystarczy zrobienie jednego pliku, co robi program zip,
  • ty chcesz zmusić program zip do zachowania jak gzip - chyba się nie da za pomocą samych przełączników, ale przecież możesz zrobić np find -exec { zip [przełączniki] }
0

początek rozumiem
tak dokładnie chcę otrzymać taką samą funkcjonalność programu zip co ma gzip :)

ale nie bardzo rozumiem z tymi przełącznikami można bardziej jaśniej ?? można jaśniej o co chodzi z tymi przełącznikami ?

0

find na Ubuntu służy do wyszukiwania plików, a przełącznik -exec powoduje, że dla każdego znalezionego pliku wykona się podane polecenie.

0

Nie wiem bardzo czy można tak zrobić
ponieważ ta funkcja którą piszę ma być statyczna i ma być wywoływana przez servlety :)
myślałem, że zrobię tak, że jak ktoś podaje ścieżkę do katalogu to wtedy rekurencyjnie będe przechodził między katalogami i jeśli file będzie plikiem to wykonywał zipa ale niestety w exec nie można użyć polecenia cd .... a komenda zip jeśli będę podawał ścieżkę to mi ją zamieści w archiwum :/

0

Tak na dobrą sprawę to w Javie jest przecież klasa java.util.zip.ZipOutputStream i sam możesz sobie zrobić .zipa, bez korzystania z zewnętrznych narzędzi.

0

wiem że jest taka klasa i uwierz chciałbym z niej skorzystać ale jak może pisałeś dla kogoś to widzisz mam zalecenie by użyć linuxowego polecenia zip poprzez wykonanie exec:/

co komplikuje sprawę
Na twoją głowę da się coś takiego zrobić ??? czy nie jest to możliwe ??

ale jeśli mam podaną ścieżkę w której mają być dane pliki zmienione

to może da sie wykonać np: find /home/user/test -exec {zip } ??? tylko nie wiem jak ta komenda miałaby wyglądać :/

0

No to może polecenie typu: find . -type f -execdir zip '{}'.zip '{}' ; , tyle że trzeba tu pominąć już zrobione pliki zip.

0

myślałem nad czymś takim find /home/name/test -type f -exec zip '{}'.zip '{}' ;

ale chyba zle napisane :/

Działa mistrzu działa :D
to jest polecenie find /home/name/test -type f -exec zip '{}'.zip '{}' ;

0

Qurcze komenda działa dobrze pod linuxem i robi to co do niej należy czyli jest dobrze ale jak chce użyc w programie to już wywala błędy mam coś takiego :

String exec = "find /home/user/test -type f -exec zip '{}'.zip  '{}' \\;";
    Process p = Runtime.getRuntime.exec(exec);
    logger.info("command: " + exec);

String errResponse = ProcessUtils.readProcessErrorResponse(p);

i wywala mi Process error response: find nieprawidłowe argumenty dla " -exec".

pewnie pluje sie ze mam w exec zamieszczone 2 exec :/

jak to można obejść ??

komenda jest dobra bo jak skopiowałem z logger.info("command : " + exec); i wkleilem to do linuxa to wszystko działa czyli jest git więc pluje sie pewnie że 2 razy wywołuje exec :/

komenda find /home/user/test -type f działa dobrze ale juz z exec sie wali wszystko :/

0

A nie możesz po prostu użyć wbudowanych możliwości zipowania w Javie ? ;p

0
[losowa nazwa] napisał(a)

A nie możesz po prostu użyć wbudowanych możliwości zipowania w Javie ? ;p

tak jak pisałem wcześniej nie mogę bo mam zadane aby było to wykonane poprzez linuxa :) jak bym mógł to bym się tak nad tym nie bawił :)

0

W sumie mam jedno rozwiązanie wykonać exec tylko find /home/user/test -type f

zapisać odpowiedz do tablicy albo listy czyli miałbym gzie dane pliki się znajdują i następnie iteraxyjnie wykonywać zipowanie
czyli miałbym List<String> w których bym miał scieżke do danego pliku i potem w pętli zipować

wtedy mam np 2 exec : zip /home/test/file.zip /home/test/file.java

tylko jest jedno ale jak wykonam takiego zipa to jak otwieram go to muszę przejść przez katalogi /home potem test i dopiero jest plik ??

a chodzi o to żeby w archiwum był tylko plik :/ ??

tylko jak zrobić żeby w tych plikach zipowych nie było ścieżki tylko sam plik ??

Tylko nie wiem jak zrobić żeby polecenie linuxa zip nie zapisywało w archiwum sciezki do pliku tylko sam plik ??

0

Użyj drugiego wariantu metody exec, która przyjmuje nazwę programu i argumenty jako tablicę:
http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec%28java.lang.String[]%29

0

Dobre tylko jak z tego skorzystać :)
nie mam za bardzo doświadczenia jak tą moją komendę "find /home/user/test -type f -exec zip '{}'.zip '{}' \;";
mogę wykonać w tym execu ?? :/

Napisałem coś takiego : String[] command = {"find /home/user/test -type f", " zip '{}'.zip '{}' \;"}';
String[] env =null;
dobrze myślę ??

ale wyskakuje mi Cannot run program find /home/user/test -type f" java.io.IOException: error = 2, No such file or directory ?? a przecież działa pod linuxem jest takie directory ?? nie czaje

nie bardzo wiem jak tego użyć

1 użytkowników online, w tym zalogowanych: 0, gości: 1