2017-08-15 72 views
-2

我想使用脚本在UNIX上重命名文件夹中的文件。
原始文件的格式为:Unix重命名文件

abc.txt.temp

,我想它重命名为:

abc.txt

许多文件中使用这种格式,我想删除.temp从原始文件名称。

+0

显示'这prename'输出 – RomanPerekhrest

+0

您可能需要使用'mmv'工具:'MMV “* .txt.temp” “#的1.txt”' –

+1

可能的复制[Shell/Bash快捷方式批量重命名文件夹中的文件](https://stackoverflow.com/questions/8416990/shell-bash-shortcut-for-bulk-renaming-of-files-in-a-folder) – Fabien

回答

2

答案西普里安了测试,无疑是一个选项,但我觉得它的限制。 下面的解决方案非常灵活,因为您不必实际计算任何内容,并且可以从任何位置删除文本,而不仅仅是结尾。

下面的命令(1行)将去除.temp的任何提及中的所有文件:

for filename in *; do mv "$filename" "${filename//.temp/}"; done 

的“*”表示当前文件夹中的所有文件。您可以使用* .temp来实现与Ciprian方法完全相同的结果。 (也就是说,只从以.temp结尾的文件中删除.temp)

+0

工作正常。我能够快速重命名一堆文件。在1班轮! – Ritesh

+0

很高兴能帮到你!我已经使用这个命令很多自己,并总是得到我正在寻找的结果:) 考虑将我的答案标记为“接受”,这样它会显示在顶部,所以其他人可以更快地找到答案。 –

+0

用于$ *中的文件名; do mv“$ filename”“$ {filename //。temp /}”;这工作正常。但是如果我想重命名说100个文件并且只有特定日期,这会变得乏味。有没有一种方法,我只将日期作为参数传递给脚本,并且它仅重命名该日期的文件而不让我传递文件名 – Ritesh

-1

与像 'rename.sh' 的名称创建以下脚本:

#!/bin/bash 

TARGET_DIR=$1 
TARGET_FILES="$TARGET_DIR/*.temp" 

for fileName in $TARGET_FILES 
do 
    newFileName=${fileName::-5} 
    mv -v "${fileName}" "${newFileName}" 
done 

${var:offset:length}扩张需要的bash版本4或更高。

给它执行权限:

chmod a+x rename.sh 

你需要调用它并传递.temp文件作为参数的目录名。这样称呼它:

./rename.sh /path/to/the/temp-files 

脚本遍历目标文件夹中所有* .temp文件,从文件路径中提取的最后5个字符(“.temp”是5个字符)和移动原始文件到不包含.temp作为扩展名的新文件。

编辑:上一个CentOS 7

+0

子串表达式<0错误 – Ritesh

+0

@Ritesh,我向mv命令添加了详细模式。请修改脚本并重新运行。注意mv命令的-v选项。之后,请显示输出。我怀疑文件名的问题,但我们需要确切地看到这是什么。 –

+0

可能需要处理:: - :) –

1

我不了解UNIX,但是因为问题也有Linux标记,它可能只是UNIX/Linux的混淆。

大多数GNU/Linux发行版都有rename命令。根据rename版本,与barfiles名称替换foo语法可以是简单的

rename foo bar files 

或者按照sed的正则表达式语法:

rename 's/foo/bar/' files 

在你的情况,你想在所有以.temp结尾的文件中用空字符串('')替换.temp,因此根据您的rename版本,这些命令中的一个应该可以工作:

rename .temp '' *.temp 

rename 's/\.temp$//' *.temp