在 makefile 中运行脚本命令 (Linux make)

在 makefile 中运行脚本命令 (Linux make)

我昨晚大部分时间都在与此作斗争。

我想将 makefile 中的所有文件重命名xxxx-yyyyxxxx:yyyy文件夹中的文件。

我有一个renamefiles.sh可以很好地完成工作的:

#!/bin/sh
for i in $i
 do
   echo $i
   echo mv "${i}" "${f//-/:}";
   mv "${i}" "${f//-/:}";
 done

但我真的很想把它放在 makefile 中。

该 makefile 来自 OpenWRT/Lede;其需要的代码片段是:

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

所以我真的很想在 makefile 中重命名 $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/????-????????:????

但无论我尝试什么,我似乎都会遇到一些错误(通常unexpected end of file来自bash?)。

我也在寻找一种不需要额外先决条件就能工作的解决方案;例如,我的第一项研究表明它rename可以很好地完成工作,但我被警告,因为它并不是到处都可用。

答案1

而不是编辑我自己的问题;我想我会回答它,这样问题就可以参考了。

是的,脚本也不起作用......

“工作”脚本如下:

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

因此;更正:

  1. 后面加$1。

  2. #!/bin/sh 和 #!/bin/bash 中的文件名替换不同 - 基本上 ${FILENAME//-/:} 在我的 #!/bin/sh 中不起作用....(请注意 ${var//xyz/abc} - 两个斜杠表示“用 abc 替换每个 xyz,一个斜杠表示用 abc 替换第一个 xyz。还请注意,连字符可能需要转义,因为它可以指示范围指示符)。

  3. 在 for 循环之前添加“shopt -s nullglob”,否则如果没有匹配的文件,它将把搜索模式作为文件提供给您....

  4. 仅对文件名进行替换,因为路径有很多带连字符的目录!

使用‘重命名’——项目维护者不允许:(。

现在将其放入 makefile 中。

  1. 我最初的问题是我无法跳过“bash - 意外的文件结束”。其实很简单 - 所有内容都必须有效地放在一行上。使用 (space);(space)\ 结束行,以使 bash 使用 ';' 作为行尾标记,并使用 '\' 来表示您希望在同一行上向 bash 呈现的所有内容。

  2. 使用 $。我在很多地方都看到,在 makefile 中,如果您使用 $ 传递到 bash,那么您必须使用两个(即 $$FILENAME)。但我必须使用四个 ($$$$FILENAME)。目前我所能假设的是,在 Lede/Openwrt 的复杂 buildroot 系统中,makefile 以某种方式包含包含包含,而我通过实验只找到了 4 个。我没有在任何其他已回答的有关 makefile 中的循环的问题中看到这一点 :)。

因此,最终的 makefile 片段是:(请注意 shopt,这样即使没有找到文件它也能工作)

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=$$$${FILENAME//-/:} ; \
    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/

我希望这些信息能对其他人有所帮助。

相关内容