重命名文件并保留特定模式

时间:2017-07-17 13:03:07

标签: linux bash sed

我需要在文件夹中重命名PDF。有人不断向我发送不同的文件名。但是,最后的1位或2位数字是好的。它们应该是一样的。

  • NK 2017 no 4.pdf
  • NK pdf 2017 no。 5.pdf
  • NK PDF 2016.09.09 no。 19.pdf
  • NK 2016.08.26 no。 18.pdf

等等。只保留最后一个号码,

  • number4.pdf
  • number5.pdf
  • number19.pdf
  • number18.pdf

我试图用正则表达式取代结果,但没有运气。当我使用sed的/ 2017 / foo /'之类的代码时,代码可以正常工作。但是我需要结果中.pdf之前的最后一个数字的模式..错误是什么,我做错了什么?

#!/bin/bash
find /home/foo/bar/ -type f -iname "NK*" -print0 | while read -d $'\0' f
do
  mv "$f" "`echo $f | sed 's/.+\([0-9]{1,3}\.pdf\)/number\1/'`";
done

2 个答案:

答案 0 :(得分:2)

mv命令更改为:

mv "$f" "$(echo "$f" | sed 's/.*[^0-9]\([0-9]\{1,3\}\.pdf\)/number\1/')"

基本正则表达式不支持以下内容:

  • .+(使用.*代替)
  • {m,n}(使用\{m,n\}代替)

答案 1 :(得分:0)

您的回答的问题是您错过了$变量,并且正在逃避正则表达式中需要的括号。

#!/bin/bash
find /home/foo/bar/ -type f -iname "NK*" -print0 | while read -d $'\0' f
do
  mv "$f" "`echo $f | sed 's/.* ([0-9]{1,3}).pdf/number$1.pdf/'`";
done

未转义的括号允许您以变量形式访问组。第一组是$1,它从那里开始增加。