鉴于以下结构:
source/
dir1/
file1.ext1
file2.ext2
dir2/
file3.ext3
dir3/
file4.ext4
我想要实现以下目标:
destination/
dir1file1.ext1
dir1file2.ext2
dir2file3.ext3
dir3file4.ext4
换句话说,我想将所有文件从源递归移动到目标,并将原始子目录名称附加到文件名。
答案1
使用 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
用于测试,请将其删除以实际移动文件。