递归地将目录名添加到文件名
鉴于以下结构:
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
用于测试,删除它以实际移动文件。