我昨晚大部分时间都在与此作斗争。
我想将 makefile 中的所有文件重命名xxxx-yyyy
为xxxx: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。
#!/bin/sh 和 #!/bin/bash 中的文件名替换不同 - 基本上 ${FILENAME//-/:} 在我的 #!/bin/sh 中不起作用....(请注意 ${var//xyz/abc} - 两个斜杠表示“用 abc 替换每个 xyz,一个斜杠表示用 abc 替换第一个 xyz。还请注意,连字符可能需要转义,因为它可以指示范围指示符)。
在 for 循环之前添加“shopt -s nullglob”,否则如果没有匹配的文件,它将把搜索模式作为文件提供给您....
仅对文件名进行替换,因为路径有很多带连字符的目录!
使用‘重命名’——项目维护者不允许:(。
现在将其放入 makefile 中。
我最初的问题是我无法跳过“bash - 意外的文件结束”。其实很简单 - 所有内容都必须有效地放在一行上。使用 (space);(space)\ 结束行,以使 bash 使用 ';' 作为行尾标记,并使用 '\' 来表示您希望在同一行上向 bash 呈现的所有内容。
使用 $。我在很多地方都看到,在 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/
我希望这些信息能对其他人有所帮助。