使用带有bash的正则表达式重命名文件

mxg*_*mxg 50 regex bash

可能重复:
在unix中一次重命名多个文件

我想使用正则表达式重命名文件夹中的所有文件(在名称末尾添加名称)并移动到另一个文件夹.

我认为它应该是这样的:

mv -v ./images/*.png ./test/*test.png
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

谁能建议我一个解决方案?

kib*_*zer 80

如果您使用的是Linux,请检查特殊rename命令,即使用正则表达式重命名.

rename 's/^images\/(.+)/test\/$1.png/s' images/*.png
Run Code Online (Sandbox Code Playgroud)

否则,像catwalk建议的那样在文件名上写一个bash循环.

  • 记住/打字要少得多,谢谢!`rename's/_20// g'*.mp4` (8认同)
  • 在某些系统上它可能被称为"prename". (5认同)
  • 也可以通过自制软件`brew install rename` 在 mac 上使用 (2认同)
  • 我来到这里是因为我想在目标名称中使用捕获“$1”,通过“'s/blah_blah(\d\d)blah_blah([0- 9A-F]{8})/$1/'` (2认同)

cat*_*alk 55

试试这个:

for x in *.png;do mv $x test/${x%.png}test.png;done
Run Code Online (Sandbox Code Playgroud)

  • 实际上,如果文件名包含空格,那么你可以使用带有或不带引号的`for`.这就是为什么最好使用*generator | 读线; 做一些"$ line"; 完成*成语 在这种情况下:`ls | grep'\ .png $'| 读x时; 做......; done` (4认同)
  • 你应该在变量名称周围加上引号,以防文件名中有空格:`for x in*.png; 做mv"$ x""test/$ {x%.png} test.png"; done` (3认同)
  • 是不是使用globs而不是正则表达式? (3认同)
  • @justsomebody:只需使用 IFS=$'\n'; 在你的队伍前面然后 (2认同)

Gre*_*con 43

$ for old in ./images*.png; do
    new=$(echo $old | sed -e 's/\.png$/test.png/')
    mv -v "$old" "$new"
  done
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢sed的使用,因为它允许我用我喜欢的任何东西替换它.在我的情况下,将"%20"替换为"".我在正则表达式的末尾使用'g'来允许:对于旧的*.pdf; do new = $(echo $ old | sed -e's/\%20// g'); mv $ old"$ new";完成 (3认同)
  • 谢谢!我从中导出了单行代码 `mv file_20name.mp4 "$(echo file_20name.mp4 | sed -e 's/_20/ /g')"` (2认同)
  • 很漂亮,因为这允许 sed 正则表达式语法的全部功能。命令的完美组合,以及许多其他 bash 脚本的良好原型。 (2认同)

小智 5

另一个解决方案是一个名为"mmv"的工具:mmv"./ images/*.png""./ test /#1test.png"