用于批量重命名文件夹中文件的 Shell/Bash 快捷方式

问题描述 投票:0回答:9

Shell/Bash 中是否有快捷方式可以根据正则表达式或其他标准重命名文件夹中的所有文件。我在这里寻找的是我的文件夹文档,假设有 100 个具有以下命名约定的文本文件:

<longdocumentidentifier>-doc-<counter>.txt.

我需要将具有上述给定约定的所有文件重命名为:

doc-<counter>.txt

有没有一句话可以帮助我解决上述问题?

linux bash file-io scripting
9个回答
154
投票

我会建议这样的事情:

for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done

${i/*-doc-/doc-}
将第一次出现的
*-doc-
替换为
doc-

如果您需要进行多次替换(请参阅注释 1),则需要使用

${var//Pattern/Replacement}
变体。如果需要替换名称的开头,则需要使用
${var/#Pattern/Replacement}
,如果需要替换结尾(即:扩展名),则需要使用
${var/%Pattern/Replacement}
形式。

请参阅Shell 参数扩展了解更多详细信息。此扩展是特定于 bash 的。


28
投票

如果您有

rename
那么,
rename 's/^.*-doc-/doc-/' *.txt
应该可以解决问题。


16
投票

prename
,允许您使用 REGEX:

prename 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

使用选项

-n
来模拟:

prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

注意: 在许多 Linux 发行版中,这都是作为

rename
提供的,但并非在所有发行版中都如此——所以我使用 Perl 附带的实用程序的规范名称。


12
投票

如果想递归到子目录,还有:

find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv

在自动支持扩展正则表达式的系统上,您可以省略

-E

优点:

  • 递归到子目录
  • 您可以控制递归的最大深度
  • 您可以重命名文件和/或目录(-type f|d)

缺点:

  • 正则表达式稍微复杂一些,因为你必须去掉路径才能获取文件名

(答案修改自此处


8
投票

例如,大多数 Linux 内置的重命名命令可以轻松完成此操作。

就我个人而言,我也更喜欢正则表达式,这就是为什么我在很长一段时间内一直使用这个脚本(阅读:自 80 年代末或 90 年代初):

#!/usr/bin/perl

($op = shift) || die "Usage: $0 expr [files]]\n";

if(!@ARGV)
  {
  @ARGV = <STDIN>;
  chop(@ARGV);
  }

for (@ARGV)
  {
  $was = $_;
  eval $op;
  die $@ if $@;

  if ($was ne $_)
    {
    print "rename($was,$_)\n";
    rename($was,$_);
    }
  }

安装后,您可以执行以下操作:

script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt

6
投票
mmv "*-doc-*" "doc-#2"

mmv 命令代表“质量移动”


3
投票

如果您不介意外部工具,那么这里有一个:rnm网页

对于您的特定问题,命令是:

rnm -rs '/.*-doc-/doc-/' *.txt

或者

rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt

您可以在此处找到更多示例/文档。


0
投票

找到。 -名称 '*scss' | xargs -L1 -I {} 回显 {} {} | sed 's/css.scss$/scss/' | sed 's/css.scss$/scss/' | xargs -L1 mv

例如,如果您有一堆以“.css.scss”结尾的文件,并且您想将它们重命名为仅以“.scss”结尾(即删除 .css 部分)

调整正则表达式并找到满足您需求的参数


0
投票

也许cada也可以提供帮助:

cada 'mv *-doc-*.txt {}' 're.findall("doc-\d+\.txt$", s)[0]'
© www.soinside.com 2019 - 2024. All rights reserved.