Ubuntu 14.04递归文件重命名单个文件,将目录名附加到filename

时间:2015-10-30 18:23:52

标签: bash file rename

在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年了......呜咽呜咽...... 任何人都可以帮助一些活泼而不太复杂的东西吗? 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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分别是源文件夹和目标文件夹。