使用脚本重命名目录中的文件

时间:2013-06-03 17:56:35

标签: bash

我们的SVN用户上传的文件名称为

filename_INT filename2_INT filename3_INT

我需要通过将_INT移除到原始文件名(例如

)来重命名这些文件

filename filename2 filename3

在bash中执行此操作的最佳方法是什么?

我尝试使用sed,但它在脚本上失败但在命令行上失败,

[root@hostname tags]# echo filename_INT | sed 's/_INT[a-z.]*//g'

filename.php

4 个答案:

答案 0 :(得分:6)

这个单行应该处理当前目录中的所有*_INT个文件:

for file in *_INT; do mv "$file" "${file%_INT}"; done

如果你想以递归方式对所有文件和子目录进行操作,你可以这样做:

find path -name '*_INT' | sed -e 's/\(.*\)_INT$/mv "&" "\1"/'

这是一堆打印但未执行的mv命令的输出。如果它看起来不错并且你想要执行它,只需将它管道传递给sh,如下所示:

find path -name '*_INT' | sed -e 's/\(.*\)_INT$/mv "&" "\1"/' | sh

答案 1 :(得分:1)

这需要在您的Subversion存储库中完成,还是只在本地完成?

如果只是在本地,您可以使用find查找所有文件:

find . -name "*_INT"

文件名称中是否有空格?如果没有,以下情况应该有效:

find . -name "*_INT" | while read file
do
    mv $file ${file%_INT}
done

${file%_INT}使用名为Pattern Matching Operators的bash / kornshell机制。这些可以快速过滤掉文件名中的前缀和后缀。例如,如果:

$ file=foo.txt_INT
$ echo $file         #Prints "foo.txt_INT"
$ echo ${file%_INT}  #Prints "foo.txt"
$ echo ${file#foo}   #Prints ".txt_INT"

现在您已拥有文件的旧名称和新名称,您只需使用mv命令即可​​。当然,可能存在一个已存在该名称的文件。是否可以覆盖。如果没有,你将不得不弄清楚如何处理它:

find . -name "*_INT" | while read file
do
    if [ ! -e $file ]
    then
        mv $file ${file%_INT}
    else
        echo "File ${file%_INT} already exists"
    fi
done

答案 2 :(得分:0)

如果您有权访问rename命令:

rename 's/_INT//' *_INT

答案 3 :(得分:0)

rename命令应该是您最好的选择。我的手册页告诉我(我已经验证)这有效:

rename _INT "" *_INT