以递归方式从shell中的文件中删除文件名后缀

时间:2010-08-05 12:49:43

标签: unix deployment filenames rename

当我们在本地开发时,我们将“.dev”或“.prod”附加到应该仅分别对开发/生产服务器可用的文件中。

我想做的是;在将站点部署到服务器之后,以递归方式查找具有“.dev”后缀的所有文件(例如)并将其删除(重命名文件)。我将如何进行此操作,最好完全在shell中(没有脚本),以便将其添加到我们的部署脚本中?

我们的服务器运行Ubuntu 10.04。

4 个答案:

答案 0 :(得分:3)

尝试此操作(不完全仅限shell,需要findmv实用程序):

find . '(' -name '*.dev' -o -name '*.prod' ')' -type f -execdir sh -c 'mv -- "$0" "${0%.*}"' '{}' ';'

如果您拥有renamexargs实用程序,则可以加快速度:

find . '(' -name '*.dev' -o -name '*.prod' ')' -type f -print0 | xargs -0 rename 's/\.(dev|prod)$//'

两个版本都应该使用任何文件名,包括包含换行符的文件名。

答案 1 :(得分:1)

for file in `ls *.dev`; do echo "Old Name $file"; new_name=`echo $file | sed -e 's/dev//'` ; echo "New Name $new_name"; mv $file $new_name; done

在我最近使用的一个示例中,此代码查找以new.xml结尾的任何文件更改文件名中的日期(文件名的格式为xmlEventLog_2010-03-23T11:16:16_PFM_1_1.xml),删除从名称中重新_new并将文件名重命名为新名称:

for file in `ls *new.xml`; do echo "Old Name $file"; new_name=`echo $file | sed -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/2010-03-23/g' | sed 's/_new//g'` ; echo "New Name $new_name"; mv $file $new_name; done

这是你想要的东西吗?

答案 2 :(得分:0)

它完全未经测试,但这应该适用于您选择的POSIX类外壳:

remove-suffix () {
    local filename
    while read filename; do
        mv "$filename" "$(printf %s "$filename" | sed "s/\\.$1\$//")"
    done
}

find -name '*.dev' | remove-suffix .dev

注意:在非常不寻常的情况下,您的一个或多个文件名包含换行符this won't work

答案 3 :(得分:0)

find /fullpath -type f -name "*.dev"|sed 's|\(.*\)\(\.pdf\)|mv & \1.sometag|' | sh