Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 重命名文件名的一部分_Bash_Filenames_Rename - Fatal编程技术网

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上非常有效,这太棒了!