Skriptbefehle innerhalb eines Makefiles ausführen (Linux make)

782
Simon H

Ich habe letzte Nacht damit gekämpft.

Ich möchte alle Dateien umbenennen, xxxx-yyyyum xxxx:yyyyin einem Ordner von einer Make - Datei.

Ich habe eine, renamefiles.shdie den Job gut macht:

#!/bin/sh for i in $i do echo $i echo mv "$" "$"; mv "$" "$"; done 

Aber ich würde das wirklich gerne in ein Makefile einfügen.

Das Makefile stammt von OpenWRT / Lede; Der Ausschnitt, wo es sein muss, ist:

define Build/Prepare $(Build/Prepare/Default) tar xvfj $(DL_DIR)/$(PKG_DATA_FILENAME) -C $(PKG_BUILD_DIR) rm -f \ $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/05c6:1000:sVe=GT cp ./data/* $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/  ./renamefiles.sh $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/ endef 

So würde ich wirklich in der Make - Datei möchte, umbenennen $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-????zu????:????

Aber was auch immer ich versuchte, ich schien einen Fehler zu bekommen (normalerweise unexpected end of fileaus bash?).

Ich suche auch nach einer Lösung, die ohne zusätzliche Voraussetzungen funktioniert. zB meine erste Recherche ergab, dass renamedies die Arbeit gut machen würde, aber ich wurde gewarnt, weil es nicht überall verfügbar ist.

0
1) Ist `for i in $ i` eine echte Kopie / Einfügung? sollte es nicht für $ in $ sein? 2) Der Aufruf der Makefile sollte `./renamefiles.sh $ (PKG_BUILD_DIR) / $ (PKG_DATA_PATH) /usb_modeswitch.d / ???? - ???? sein Archemar vor 7 Jahren 1
Erwägen Sie auch den Befehl "Umbenennen" (in vielen Distros verpackt) mit einem regexp im Perl-Stil anstelle eines hausgemachten Skripts. dirkt vor 7 Jahren 0
@dirkt - siehe unten. "Umbenennen" war meine erste Wahl :). Simon H vor 7 Jahren 0
@Archemar - ja, es war spät, und ich hatte die meisten meiner Testarbeiten bereits gelöscht! Danke für die Hervorhebung ...; Simon H vor 7 Jahren 0

1 Antwort auf die Frage

1
Simon H

anstatt meine eigene Frage zu bearbeiten; Ich dachte, ich würde es beantworten, also ist die Frage da, um darauf zu verweisen.

Ja, das Skript hat auch nicht funktioniert.

Das 'Arbeits'-Skript lautet wie folgt:

#!/bin/bash shopt -s nullglob for i in $1*-* do echo file is $i FILENAME=$(basename $i) echo filename is $FILENAME NEWNAME=$ echo newname is $NEWNAME rm "$1$NEWNAME" mv "$1$FILENAME" "$1$NEWNAME" done 

so; Korrekturen:

  1. $ 1 nach dem für.

  2. Die Ersetzung im Dateinamen unterscheidet sich in #! / bin / sh und #! / bin / bash. Grundsätzlich funktioniert $ nicht in MY #! / bin / sh .... (Hinweis zu $ - die beiden Schrägstriche bedeuten 'JEDES xyz durch abc ersetzen, ein einzelnes bedeutet, dass das erste xyz mit abc neu definiert wird. Beachten Sie außerdem, dass ein Bindestrich mit einem Escape-Zeichen versehen werden kann, da er einen Bereichsindikator anzeigen kann.

  3. Fügen Sie vor der for-Schleife 'shopt -s nullglob' hinzu. Andernfalls, wenn KEINE passenden Dateien vorhanden sind, erhalten Sie das Suchmuster als Datei.

  4. tun Sie nur den Dateinamen, da der Pfad viele Verzeichnisse mit Bindestrich enthielt!

Verwendung von 'Umbenennen' - wurde vom Projektbetreuer nicht erlaubt :(.

Nun, um es in das Makefile zu legen.

  1. Mein ursprüngliches Problem war, dass ich nicht an "Bash - unerwartetes Ende der Datei" vorbeikommen konnte. Ganz einfach - alles muss effektiv auf einer Linie sein. Endzeilen mit (Leerzeichen); (Leerzeichen) \, damit bash das ';' als Zeilenende-Marker und geben Sie mit '\' an, dass Sie alles auf derselben Zeile als Bash präsentieren möchten.

  2. Verwendung von $. Ich habe an vielen Stellen gelesen, dass in Makefiles, wenn Sie $ verwenden, um durch bash zu gelangen, Sie zwei verwenden mussten (zB $$ FILENAME). Aber ich musste VIER ($$$$ FILENAME) verwenden. Ich kann an dieser Stelle nur davon ausgehen, dass die Makefiles in dem komplexen Buildroot-System von Lede / Openwrt in gewisser Weise Include-Includes von Includes sind und ich nur 4 durch Experimente gefunden habe. Ich habe dies in keiner der anderen beantworteten Fragen zu Loops in Makefiles gesehen :).

also das letzte Makefile-Snippet: (Beachten Sie das Shopt, damit es auch funktioniert, wenn keine Dateien gefunden werden).

shopt -s nullglob ; \ for filevar in $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/*-* ; \ do \ echo file is $$$$filevar ; \ FILENAME=$$$$(basename $$$$filevar) ; \ echo filename is $$$$FILENAME ; \ NEWNAME=$$$$ ; \ echo newname is $$$$NEWNAME ; \ echo 'rm "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME"' ; \ echo 'mv "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$FILENAME" "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME"' ; \ rm "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME" ; \ mv "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$FILENAME" "$(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/$$$$NEWNAME" ; \ done ls $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/ 

Ich hoffe, diese Info hilft jemandem.