【问题标题】:Ubuntu 14.04 recursive file rename individual files appending directory name to filename [duplicate]Ubuntu 14.04递归文件重命名单个文件,将目录名附加到文件名[重复]
【发布时间】:2016-01-31 06:27:27
【问题描述】:

在 Ubuntu 14.04 上,我有位于不同子目录但文件名相同的文件。即:

dirA/file01.jpg, dirA/file02.jpg, dirA/file03.jpg

dirB/file01.jpg, dirB/file02.jpg, dirB/file03.jpg

dirC/file01.jpg, dirC/file02.jpg, dirC/file03.jpg

我想将不同子目录(大约 200 个)中包含的所有文件(大约 1000 个)递归复制到单独的单个目录(/home/user/temp/)中。

由于它们具有相同的文件名,我想重命名所有 1000 个单独的文件,并将它们各自的目录附加到文件名,从而使它们独一无二,如下所示:

/home/user/temp/dirA-01.jpg,
/home/user/temp/dirA-02.jpg,
/home/user/temp/dirA-03.jpg

/home/user/temp/dirB-01.jpg,
/home/user/temp/dirB-02.jpg,
/home/user/temp/dirB-03.jpg,

/home/user/temp/dirC-01.jpg
/home/user/temp/dirC-02.jpg
/home/user/temp/dirC-03.jpg

所有 (1000) 个文件都应存储在同一个最终目录 (home/user/temp) 中。

我尝试使用 ls,然后查找,然后重命名,然后是 mv,然后是 cp,但问题太多,无法一一列举。如果我的 PERL 达到标准,我会在一分钟内搞定它,但我已经 15 年没有使用它了……呜咽呜咽…… 任何人都可以帮忙解决一些简单而又不太复杂的事情吗? 非常感谢您的帮助。

【问题讨论】:

  • 感谢你们将我的问题标记为已回答。我有限的编码知识不允许我理解详尽的答案以验证它们是否适合我。我确实知道问题顶部链接所指示的答案不会更改文件名以包含目录名。所以,它真的没有解决这个问题。感谢您的反馈。赛勒斯(下)的回答一针见血!流畅,简单,完全符合我的需要。谢谢大家。

标签: bash file rename


【解决方案1】:
find "$SRC" -name '*.jpg' -exec perl -e'
   for (@ARGV) {
      $o = $_;
      s{^\Q$ENV{SRC}/}{};
      s{/file}{-};
      $n = "$ENV{DST}/$_";
      if (-e $n) {
         warn("rename $o to $n: Already exists\n");
      } elsif (!rename($o, $n)) {
         warn("rename $o to $n: $!\n");
      }
   }
' {} +

if -e $n 确保您不会意外覆盖任何内容。

$SRC$DST 分别是源文件夹和目标文件夹。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2014-07-12
    • 2021-02-28
    • 2020-11-23
    • 1970-01-01
    • 2016-05-07
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多