2010-11-18 5 views
4

Ich muss Java von KSH-Skript ausführen, nachdem ich eine Liste von Dateien in einem Verzeichnis als Argumente für die Ausführung dieser Java-Klasse erhalten habe.KSH führt Java mit Argumenten in der Variablen

cd /batch/App/ 
find /batch/files/ -type f -print -name "*.xls" >> $list_of_files 
/usr/java14/bin/java ConvertApp $list_of_files 

, in denen ich denke, es wie /usr/java14/bin/java ConvertApp test1.xls test2.xls test3.xls

funktioniert Aber es scheint, dass das Argument für Java vorbei war nicht erfolgreich. Hat jemand eine Idee dafür? Vielen Dank.

Antwort

1

Sie können sehen, xargs.

Versuchen Sie, diese

find /batch/files/ -type f -print -name "*.xls" | xargs /usr/java14/bin/java ConvertApp 
+0

es funktioniert wie ein Charme. Danke =) – Tsubasa

+0

Wird dies nicht die App einmal für jede Datei ausführen, mit dieser Datei als Argument? – Qwerky

+0

Nein, das ist der Punkt mit 'xargs'. Es legt alle Dateien als eine lange Zeichenfolge von Argumenten ab. – aioobe

0

Ich glaube, Sie zwei Probleme haben.

  1. find Ausgänge entspricht einer pro Zeile, müssen Sie diese konvertieren, so dass sie Raum begrenzt sind, vielleicht durch sed oder awk verwenden.

  2. Sie sollten wahrscheinlich die Ausgabe in eine Variable setzen, mit;

    list_of_files = 'find ........'

dann java Aufruf mit

java ConvertApp ${list_of_files} 
0

Sie Anhängen der .xls Dateien von find Befehl in die Datei $list_of_files gefunden.

Als nächstes möchten Sie den Inhalt dieser Datei als Befehlszeilenargument an Ihr Java-Programm senden. Dazu müssen Sie den Befehl Substitution verwenden können, wie:

/usr/java14/bin/java ConvertApp "$(cat $list_of_files)" 

oder

/usr/java14/bin/java ConvertApp "`cat $list_of_files`" 
1

find ... -print0 | xargs -0 ... ist der Weg zu gehen.

Die Antworten, die cat oder eine Variable empfehlen, schlagen fehl, wenn Leerzeichen in Dateinamen vorhanden sind. Wenn Sie nicht xargs verwenden möchten, können Sie eine bessere Chance auf Erfolg, wenn Sie ein Array verwenden:

saveIFS=$IFS IFS=$'\n' 
files=($(find...)) 
IFS=$saveIFS 
java ... "${files[@]}" 
Verwandte Themen