【问题标题】:Rename files named foobar(12345).txt to 12345.txt将名为 foobar(12345).txt 的文件重命名为 12345.txt
【发布时间】:2021-10-15 00:51:08
【问题描述】:

全部:

快速简洁,我有很多这样命名的文件:

lorem(12312315).txt
    
ipsum(578938-12-315-13-416-4).txt
    
amet(ran-dom-guid).txt

我想将它们重命名为括号点文本内的内容,如下所示:

12312315.txt

578938-12-315-13-416-4.txt

randomguid.txt

我确信 sed、awk、grep 等的混合可以做到这一点,但是从 shell 中注释掉括号会让我很失望。我想不出一个能做到这一点的字符串。

如果有人愿意分享一些思考周期并帮助我,那将是一个可爱的 Karma 手势!​​

感谢阅读! -吉姆

【问题讨论】:

  • 尝试自己编写一些东西,如果不起作用,请具体向我们展示您所做的事情,以便我们为您提供帮助。您启动它,然后我们提供帮助。我们不是为你写的。向我们展示您尝试过的实际代码,然后描述发生的事情和不正确的事情,然后我们可以从那里帮助您。如果您先自己尝试一下,您可能会非常接近答案。
  • 感谢安迪的建议。点得好,我将复制并粘贴我已经尝试过的热乱七八糟的内容,以供您观赏。只是很好大声笑,我是一个黑客。
  • 关键是,如果您向我们展示您的工作成果,我们就有了工作的起点,而且对我们来说更容易。人们更有可能帮助现有代码,而不是从零开始“我该怎么做?”

标签: bash awk sed grep


【解决方案1】:

另一种风味:

find . -type f -name \*\(\*\).txt -print0 | xargs -0 sh -c '
    for filename ; do 
      basename_core="${filename##*(}"
      basename_core="${basename_core%%)*}"
      mv "${filename}" "${basename_core}".txt
    done' dummy

【讨论】:

  • 我正在考虑使用 Xargs!感谢您朝着正确的方向推动。我想也许不使用 xargs,因为并非我的环境中的所有 *nix 发行版都有 xargs,但这是个好主意,谢谢。
【解决方案2】:

这可能对你有用(GNU sed 和 shell);

sed -n 's/.*(\(.*\)).*/mv '\''&'\'' '\''\1.txt'\''/p' *.txt

这将打印出一个移动命令列表,在您验证它们是正确的之后,管道到 shell:

sed -n 's/.*(\(.*\)).*/mv '\''&'\'' '\''\1.txt'\''/p' *.txt | sh

【讨论】:

  • 谢谢波东!你的引语和评论技巧比我的好太多了! :) 今晚我会在轮班后尝试这个并发布结果。
【解决方案3】:

find 和 mv 可以处理这个问题,通过 bash 重新匹配来找到你的名字;

#!/bin/bash
touch lorem\(12312315\).txt
touch ipsum\(578938-12-315-13-416-4\).txt
touch amet\(ran-dom-guid\).txt

pat=".*\((.*)\).txt"
for f in $(find . -type f -name "*.txt" ); do
  if [[ $f =~ $pat ]]; then
    mv $f ${BASH_REMATCH[1]}.txt
  fi
done
ls *.txt

【讨论】:

  • 你刚刚递给我一个新工具!我以前没有使用过 BASH_REMATCH,但那是一些强大的东西!这个社区太棒了!我是一个新手程序员,但是一个网络专业人士,你们都很好地回答了我的愚蠢问题。谢谢,我从这里得到的。我会发布我用过的。 :)
【解决方案4】:

for 循环和参数扩展。

#!/usr/bin/env bash

for f in *\(*\)*.txt; do
  temp=${f#*\(}
  value=${temp%\)*}

  case $value in
    *[!0-9-]*) value="${value//-}";;
  esac

  echo mv -v "$f" "$value.txt"
done

如果您对输出感到满意,请删除 echo,以便 mv 可以重命名/移动文件。

【讨论】:

    【解决方案5】:

    感谢大家的回复!我最终使用了你的建议并完全做其他事情,但我在这里发帖是为了后代......

    这些文件都有一个共同点,文件名中包含的 GUID 也总是包含在随附文件的第 2 行中,所以我拉出第二条,去掉不是 guid 的东西,然后重命名文件到该字符串,对于运行脚本的目录中的任何 .xml 文件。

    这样:

    for i in ./*xml
            do
                    GUID=`cat "$i" | sed -n '2p' | awk '{print $1}' | sed 's/<id>//g' | sed 's/<\/id>//'`
                    echo File "|" $i "|" is "|" $GUID
            done
    

    在实际脚本中,我做了一个 MV 而不是 ECHO,并且文件被重命名为 guid。

    希望这对将来的其他人有所帮助,是的,我知道调用 sed 三次很浪费。如果我在正则表达式方面做得更好,我相信我可以把它归结为一个! :)

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多