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

sc_*_*ray 54 linux bash scripting file-io

Shell/Bash中是否有一个快捷方式可以根据正则表达式或其他一些条件重命名文件夹中的所有文件.我在这里寻找的是在我的文件夹文件中,让我们说100个文本文件具有以下命名约定:

<longdocumentidentifier>-doc-<counter>.txt.
Run Code Online (Sandbox Code Playgroud)

我需要使用上面给出的约定将所有文件重命名为:

doc-<counter>.txt
Run Code Online (Sandbox Code Playgroud)

是否有一个可以帮助我完成上述工作的单行程?

Sor*_*rin 101

我会建议这样的事情:

for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done
Run Code Online (Sandbox Code Playgroud)

${i/*-doc-/doc-}替换第一次出现*-doc-doc-.

如果您需要进行多次替换(请参阅注释编号1),则需要使用该${var//Pattern/Replacement}变体.如果需要替换需要使用的名称的开头${var/#Pattern/Replacement},如果需要替换结尾(即:扩展名),则需要使用该${var/%Pattern/Replacement}表单.

有关详细信息,请参阅http://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1

  • 这有助于略有不同的情况; 我想用破折号替换某些文件名中的所有空格:`for i in*; 做mv"$ i"$ {i //\/ - }; done`.请注意,为此,我必须引用原始文件名. (2认同)

tel*_*hos 21

如果你有,rename那么rename 's/^.*-doc-/doc-/' *.txt应该做的伎俩.


Eli*_*les 12

prename,允许您使用REGEX:

prename 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt
Run Code Online (Sandbox Code Playgroud)

使用该选项-n模拟:

prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt
Run Code Online (Sandbox Code Playgroud)

注意:这是rename许多Linux发行版中提供的,但不是全部 - 所以我使用Perl附带的实用程序的规范名称.


Wes*_*ker 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,$_);
    }
  }
Run Code Online (Sandbox Code Playgroud)

哪个,安装后可以让你做这样的事情:

script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt
Run Code Online (Sandbox Code Playgroud)


小智 5

mmv "*-doc-*" "doc-#2"
Run Code Online (Sandbox Code Playgroud)

mmv 命令代表“大规模移动”


Ron*_*len 5

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

find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)

在自动支持扩展Regexp的系统上,您可以放弃-E.

好处:

  • 递归到子目录
  • 你可以控制递归的maxdepth
  • 你可以重命名文件和/或目录(-type f | d)

缺点:

  • 更复杂的regexp,因为你必须去掉获取文件名的路径

(答案从这里修改)