重命名文件名的一部分

not*_*eek 83 bash filenames rename

我有大量的文件,如下所示:

DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
Run Code Online (Sandbox Code Playgroud)

我希望它们看起来像这样:

DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Pau*_*xon 157

有一些重命名命令的变体,在你的情况下,它可能很简单

rename ABC XYZ *.dat
Run Code Online (Sandbox Code Playgroud)

您可能有一个采用Perl正则表达式的版本;

rename 's/ABC/XYZ/' *.dat
Run Code Online (Sandbox Code Playgroud)

  • 你的建议对我不起作用,但这个命令有效:`$ find.-name'*ABC*' - exec rename's/ABC/XYZ /'{} \;`我在Ubuntu 16.04 LTS (6认同)
  • 欢迎来到stackoverflow! (2认同)
  • 我没有重命名可用于所有Unix变种.塞德是一个很好的后退. (2认同)

小智 105

for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
Run Code Online (Sandbox Code Playgroud)

没有renamesed需要.只是bash 参数扩展.

  • 如果文件名有空格,则应使用quote.请参阅下面的代码段...`for file in*.dat; 做mv"$ file""$ {file // ABC/XYZ}"; done` (8认同)

pax*_*blo 7

像这样的东西会做到这一点.该for循环可能需要根据其档案名称,你想捕捉进行修改.

for fspec1 in DET01-ABC-5_50-*.dat ; do
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
    mv ${fspec1} ${fspec2}
done
Run Code Online (Sandbox Code Playgroud)

您应该总是在数据副本上测试这些脚本,顺便说一下,在完全不同的目录中.


小智 5

您需要学习如何使用 sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

并且还可以使用 for 来循环浏览文件条目http://www.cyberciti.biz/faq/bash-for-loop/

你的命令看起来像这样,我旁边没有术语,所以我无法检查

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
Run Code Online (Sandbox Code Playgroud)