递归地将目录名添加到文件名

鉴于以下结构:

source/ dir1/ file1.ext1 file2.ext2 dir2/ file3.ext3 dir3/ file4.ext4 

我想实现以下目标:

 destination/ dir1file1.ext1 dir1file2.ext2 dir2file3.ext3 dir3file4.ext4 

换句话说,我想以递归方式将所有文件从源移动到目标,并将原始子目录名称附加到文件名。

使用Perl重命名并find

 $ find source -type f | rename -n 's:(^|.*/)([^/]*)/([^/]*)$:destination/$2$3:' rename(source/dir2/file3.ext3, destination/dir2file3.ext3) rename(source/dir2/dir3/file4.ext4, destination/dir3file4.ext4) rename(source/dir1/file1.ext1, destination/dir1file1.ext1) rename(source/dir1/file2.ext2, destination/dir1file2.ext2) 

正则表达式(^|.*/)([^/]*)/([^/]*)将路径的最后两个组件(文件名和父目录)保存为第二个和第三个匹配的组。

在运行此目录之前, destination目录必须存在。 -n用于测试,删除它以实际移动文件。