脚本重击:从文件名中删除“-”和“ _”之间的数字

时间:2019-05-16 22:18:42

标签: bash file-rename

我需要删除文件名中介于-和_之间的序列号(也应删除下划线)。

原始文件名:20190815-12345_table_file.rar

预期:20190815-table_file.rar

我的bash代码:

for f in ./*.rar;
do fn=`echo $f|sed 's/^-[0-9].*_$/-/g'`;
mv "$f" "$fn";
done;

我尝试了类似的操作,因为我知道我的数字以“-”(所以^)开头是数字([0-9]。*),以“ _”(所以是$)结尾,我想用“-”代替数字。

但是使用这种方法无效。

2 个答案:

答案 0 :(得分:2)

您用于sed的正则表达式与您想要的方式不匹配:开始和结束定界符是行的开始和结束的锚点。另外,您希望[0-9]*的任何数量的数字都没有点。

尝试以下方法:

for f in ./*.rar; do
  fn="$( sed 's/-[0-9]*_/-/g' <<<"$f" )"
  mv "$f" "$fn"
done

在bash中,您可以使用参数扩展来进行替换而无需使用sed;我忘记了确切的语法,因此暂时将其省略,以后再添加。检查man bash以获得详细信息。

答案 1 :(得分:1)

所有Bash解决方案是:

for f in ./*.rar; do
  mv "$f" "${f/-*([0-9])_/-}"
done

您必须启用extglob的{​​{1}} shell选项,才能使shopt -s extglob模式起作用。

有关参数扩展如何工作的更多信息,请参见Bash Reference Manualthis answer