将文件重命名为文件名的前缀和中间部分

将文件重命名为文件名的前缀和中间部分

我有一个脚本,它在某一时刻执行以下操作:

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逐一替换REPLACEMEbash 脚本内部的读取调用,当我在那里时,我想将文件名更改为file.js例如删除-test.test

答案1

要将例如重命名stuff-X.js.teststuff.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 {} \;  

相关内容