我有一个脚本,它在某一时刻执行以下操作:
for src in $(find -H "$ROOT_DIR" -maxdepth 5 -name '*.test' -not -path '*.git*')
do
fixed_filename=$(echo "$(basename "${src%.*}")" | sed 's/-test//')
基本上我有一个名为thing-test.js.test
循环时我想以文件名结束thing.js
最终我将使用创建文件的完整路径path="$ROOT_DIR"/"$fixed_filename"
以上似乎工作,但它绝对不正确 - 我是 shellcheck 的狂热用户,它告诉我有一个无用的回显(我同意)并${variable//search/replace}
尽可能尝试。
希望能帮助您清理上述内容。
编辑:
我想做的基本要点是:
我试图按照特定的文件名模式递归搜索目录中的每个文件,例如,file-test.js.test
这些文件内部是占位符变量,例如我想找到所有这些文件,并用用户提供的字符串REPLACEME
逐一替换REPLACEME
bash 脚本内部的读取调用,当我在那里时,我想将文件名更改为file.js
例如删除-test
和.test
答案1
要将例如重命名stuff-X.js.test
为stuff.js
(不知道之前的扩展名.test
),您必须使用多个表达式来提取所需的部分,例如将路径拆分为头部h=${path%/*}
和尾部,t=${path##*/}
然后在破折号之前获取字符串${t%%-*}
,对于中间的字符串获取不带扩展名的名称例如noext=${t%.*}
,从该摘录中,现在的新扩展如下ext=${noext##*.}
:
find . -name '*-*.test' -exec sh -c 'h=${1%/*}; t=${1##*/}; noext=${t%.*};\
ext=${noext##*.}; fixed=${h}/${t%%-*}.${ext}; echo mv "$1" "$fixed"' sh {} \;
答案2
使用find
命令与 shell 结合使用-exec
标志:
$ find -name "*.test" -exec sh -c 'echo "$(basename -s ".test" "$1")".js' sh {} \;
one.js
three.js
two.js
请注意,basename -s ".test" "$1"
删除后缀,因此您不需要sed
首先调用。
如果最终您需要使用该“固定文件名”执行其他操作,请用变量赋值替换该 echo 并继续在同一sh
命令中工作。像这样的东西:
$ find -name "*.test" -exec sh -c 'fixed_name=$(basename -s ".test" "$1").js; my_other_command "$fixed_name"' sh {} \;