繁体   English   中英

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

[英]Shell/Bash shortcut for bulk renaming of files in a folder

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

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

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

doc-<counter>.txt

有没有可以帮助我解决上述问题的单线?

我会建议这样的事情:

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}表格。

有关更多详细信息,请参阅外壳参数扩展 此扩展是特定于 bash 的。

如果您renamerename 's/^.*-doc-/doc-/' *.txt应该可以解决问题。

prename ,它允许您使用正则表达式:

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

使用选项-n来模拟:

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

注意:这是在许多 Linux 发行版中作为rename提供的,但并非在所有发行版中都如此——所以我使用 Perl 附带的实用程序的规范名称。

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

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

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

好处:

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

缺点:

  • 稍微复杂一点的正则表达式,因为你必须去掉路径才能得到文件名

(答案从这里修改)

例如,大多数 linux 内置的 rename 命令将很容易做到这一点。

就我个人而言,我也更喜欢正则表达式,这就是为什么我一直在使用这个脚本很长一段时间(阅读:自 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
mmv "*-doc-*" "doc-#2"

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

如果您不介意外部工具,那么这里有一个: rnm ( web page )

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

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

或者

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

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

找 。 -name '*scss' | xargs -L1 -I {} echo {} {} | sed 's/css.scss$/scss/' | xargs -L1 mv

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM