Bash 重命名文件名的一部分
我有很多文件,看起来像这样:Bash 重命名文件名的一部分,bash,filenames,rename,Bash,Filenames,Rename,我有很多文件,看起来像这样: DET01-ABC-5_50-001.dat ... DET01-ABC-5_50-0025.dat DET01-XYZ-5_50-001.dat ... DET01-XYZ-5_50-0025.dat 我希望他们看起来像这样: DET01-ABC-5_50-001.dat ... DET01-ABC-5_50-0025.dat DET01-XYZ-5_50-001.dat ... DET01-XYZ-5_50-0025.dat 我如何才能做到这一点?您需要
DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
我希望他们看起来像这样:
DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat
DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat
我如何才能做到这一点?您需要学习如何使用sed 也可用于,以便您可以循环浏览文件条目 你的命令看起来像这样,我旁边没有一个术语,所以我无法检查
for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
我喜欢和塞德一起做这件事。就你而言:
for x in DET01-*.dat; do
echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/'
done | sh -e
最好先省略“sh-e”部分,看看将执行什么。重命名命令有两种变体,在您的情况下,它可能非常简单:
rename ABC XYZ *.dat
您可能有一个采用Perl正则表达式的版本
rename 's/ABC/XYZ/' *.dat
像这样的东西就行了。根据要捕获的文件名,可能需要修改
for
循环
for fspec1 in DET01-ABC-5_50-*.dat ; do
fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
mv ${fspec1} ${fspec2}
done
顺便说一句,您应该始终在数据副本上以及在完全不同的目录中测试这些脚本。所有这些答案都是简单而好的。然而,我总是喜欢在这些脚本中添加一个交互模式,以便发现误报 如果[[-n$inInteractiveMode]]
然后
echo-e-n“$oldFileName=>$newFileName\n是否要进行此更改?[Y/n]:”
读跑 [[-z$run | |“$run”==“y”| |“$run”==“y”]&&mv“$oldFileName”“$newFileName”
fi 或者将交互模式设为默认模式,并为自动脚本添加一个强制标志(-f |--force),或者如果您觉得很大胆的话。这并不会使您的速度减慢太多:默认响应是“yes,I do want to rename”(是的,我确实想重命名),这样您就可以在每次提示时按enter键(因为有“-z$run
\
测试)
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
无需
rename
或sed
即可。只需猛击即可。非常感谢!这很简单(如果您知道如何;-))我不需要重命名在所有Unix变体中都可用。Sed是一个很好的退路。我正在考虑使用Sed或编写代码;你的回答对我不起作用,没有发生任何事情你的建议对我不起作用,但是这个命令起作用了:$find-名称'*ABC*'-exec rename's/ABC/XYZ/'{}\代码>我在Ubuntu 16.04 LTS上,可能我做错了什么,但这对我的文件没有任何影响?你是在尝试使用还是不使用“sh-e”?如果你在没有它的情况下尝试是不应该的。它只是打印将要执行的内容(“mv-v……”行),作为检查一切是否正常的机会。如果你喜欢你所看到的,添加“sh-e”。并且只重命名一部分,即扩展名?我不得不将很多.TTF文件重命名为.TTF…对于osx来说,这就是这些东西。rename看起来很酷,但brew安装的rename似乎安装了一个perl脚本,按照上面的示例,该脚本不起作用。一些谷歌搜索指出,rename并不是在所有linux变量上都可用,而且实际上有一个perl版本正在浮动。我花了大约10分钟的时间来整理这些差异,然后决定-你知道这个答案很简单:)。如果文件名有空格,你应该使用引号。请参阅下面的代码片段<代码>用于*.dat中的文件;执行mv“$file”“${file//ABC/XYZ}”;完成
在OSXomg上非常有效,这太棒了!