【问题标题】:Linux cp with a regexp带有正则表达式的 Linux cp
【发布时间】:2011-08-20 23:16:27
【问题描述】:

我想复制目录中的一些文件,重命名文件但保留扩展名。这可以通过简单的cp 使用正则表达式来实现吗?

例如:

cp ^myfile\.(.*) mydir/newname.$1

所以我可以复制保留扩展名但重命名的文件。有没有办法让 cp 正则表达式中的匹配元素在命令中使用它? 如果没有,我会做一个我认为的 perl 脚本,或者如果你有其他方法......

谢谢

【问题讨论】:

  • 新名称是否源自旧名称?能否说一下具体情况,或许可以通过简单的shell替换来完成。
  • 当然。新名称与旧名称没有链接... 一个真实的例子:cp treepict_313* dir/foobar.$1 foobar 是一个网站用户给的名称,它可以是任何东西。我只是在用户下载之前用所需的名称重命名文件...不要让格式化名称为 treepict_300.ext... 这更清楚吗?
  • 或者你可能想将a.ca.sa.oa.ha.bak重命名为b.cb.sb.o和@98765433 b.bak ?
  • 就是这样,但同时将其复制到另一个目录中(我的意思是,保留 a.c、a.s、a.o、a.h 和 a.bak)

标签: regex linux cp


【解决方案1】:

假设你有myfile.amyfile.bmyfile.c

for i in myfile.*; do echo mv "$i" "${i/myfile./newname.}"; done

这会创建(在删除 echo 时)newname.anewname.bnewname.c

【讨论】:

  • @Ray:替换解决了我 90% 的文件处理需求,并且是在 Windows 中使用 Bash 的主要原因! :-)
【解决方案2】:

shell 不理解一般的正则表达式;为此,您必须外包给辅助程序。解决您的任务的经典脚本方式类似于

for a in myfile.* ; do
  b=`echo $a | sed 's!^myfile!mydir/newname!'`
  cp $a $b
done

或者让 perl 脚本生成一个命令列表,然后将这些命令输入到 shell 中。

【讨论】:

    【解决方案3】:

    我真的很喜欢rename perl 脚本(Robin Barker 和 Larry Wall 编写)的正则表达式语法,例如:

    rename "s/OldFile/NewFile/" OldFile*

    OldFile.cOldFile.h 分别重命名为 NewFile.cNewFile.h

    我只是想要一个复制命令完全相同的东西:

    copy "s/OldFile/NewFile/" OldFile*

    所以我复制了该脚本并将重命名语句更改为通过File::Copy 复制。瞧!使用 perl-regex 语法的复制命令:

    https://gist.github.com/jcward/0ead33bd79f2061c68728cc82582241f

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多