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