2016-07-28 24 views
1

Ich habe ein großes Projekt, das eine große Anzahl von Gläsern in einem Pfad ähnlich project/subproject/target/subproject.jar erstellt. Ich möchte einen Befehl machen, alle Gläser in einem komprimierten Teer zu sammeln, aber ohne die Verzeichnisse. Der Befehl, den ich mir bisher ausgedacht habe, ist: find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C $(dirname {}) $(basename {}) \; aber das funktioniert nicht ganz so wie ich es mir vorstelle, die Verzeichnisse sind immer noch da.Sammeln Sie Gläser in ein Teer ohne Verzeichnis

Hat jemand Ideen, wie Sie dieses Problem lösen können?

Antwort

1

Ihr Befehl ist ganz in der Nähe, aber das Problem ist, dass Bash $(dirname {}) und $(basename {})vor Ausführung find ausführt; so dass Ihr Befehl erweitert dazu:

find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C . {} \; 

wo die -C . ist ein No-op und die {} erweitert nur in vollem relativen Verzeichnis + Dateinamen.

Ein Allzweck- Weg, um diese Art der Sache zu beheben, ist das Argument zu -exec in einem Bash Einzeiler wickeln, so dass Sie Bash aufrufen für jede einzelne Datei, und lassen Sie es die dirname und basename auf der rechten Seite durchführen Zeit:

find project -name \*.jar -exec bash -c 'tar -rvf Collectors.tar.gz -C "$(dirname "$1")" "$(basename "$1")"' '' '{}' \; 

In Ihrem speziellen Fall jedoch würde ich Sie find Punkt ‚s -execdir Aktion, die die gleiche wie -exec außer dass es cd ist‘ s in das Verzeichnis der Datei zuerst. So können Sie einfach schreiben:

find project -name '*.jar' -execdir tar -rvf "$PWD/Collectors.tar.gz" '{}' \; 

(Beachten Sie, dass $PWD Teil, der sicher zu machen ist, dass Sie auf die Collectors.tar.gz im aktuellen Verzeichnis schreiben, anstatt in dem Verzeichnis, das find -execdir wird cd in.)

+0

Dies ist näher, aber mehrere Teere erstellt. Eins in jedem Verzeichnis. Ich brauche einen Teer mit all den Gläsern. – brostone51

+0

Whoops, ha, duh, werde reparieren, sorry. – ruakh