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

Posted

技术标签:

【中文标题】从shell中的文件递归删除文件名后缀【英文标题】:Recursively remove filename suffix from files in shell 【发布时间】:2011-03-25 19:04:12 【问题描述】:

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

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

我们的服务器运行 Ubuntu 10.04。

【问题讨论】:

这个已经回答了:***.com/questions/2171966/… @alfredodeza:感谢您指出这一点-我在那里找不到任何可以做我想做的事情(除了 shell 脚本)。然而,下面有一些很好的答案。 【参考方案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】:

它完全未经测试,但这应该可以在您选择的类似 POSIX 的 shell 中工作:

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】:

试试这个(不完全是 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,这比我的好。但是,如果您有非常严格的兼容性需求,您可能想知道 POSIX find 没有 -execdir-print0,我相信 "$0%.dev" 是一种 bashism。 这似乎运作良好;我将 's/\.dev$/.prod/' 替换为 's/\.dev$//' 因为我希望完全删除扩展。没有特别的兼容性需求,因此对 rename/xargs 的依赖不是问题。谢谢! sh 的联机帮助页说sh 知道后缀删除。 -execdir 可以替换为 -exec(Linux 手册页说安全性较低),但 -print0 无法替换。【参考方案4】:
find /fullpath -type f -name "*.dev"|sed 's|\(.*\)\(\.pdf\)|mv & \1.sometag|' | sh

【讨论】:

以上是关于从shell中的文件递归删除文件名后缀的主要内容,如果未能解决你的问题,请参考以下文章

批处理递归删除指定后缀的文件

用shell脚本批量删除文件名后缀

command shell 的知识整理

如何从bash中的字符串中删除后缀?

如何删除子目录下所有指定后缀文件?

在window上使用 linux shell 删除文件夹递归地