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

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

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

我们的服务器运行 Ubuntu 10.04。

【问题讨论】:

  • 这个已经回答了:stackoverflow.com/questions/2171966/…
  • @alfredodeza:感谢您指出这一点-我在那里找不到任何可以做我想做的事情(除了 shell 脚本)。然而,下面有一些很好的答案。

标签: unix deployment filenames rename


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 2011-01-02
      • 2012-05-19
      • 2018-01-30
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多