1

我们的 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

4 回答 4

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
于 2013-06-03T18:00:06.447 回答
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
于 2013-06-03T18:52:01.473 回答
0

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

rename _INT "" *_INT
于 2013-06-04T03:53:08.607 回答
0

如果您有权访问该rename命令:

rename 's/_INT//' *_INT
于 2013-06-03T18:10:44.987 回答