Usando renomear Perl e find
:
$ find source -type f | rename -n 's:(^|.*/)([^/]*)/([^/]*)$:destination/:'
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)
O regex (^|.*/)([^/]*)/([^/]*)
salva os dois últimos componentes do caminho (o nome do arquivo e o diretório pai) como o segundo e o terceiro grupos correspondentes.
O diretório destination
deve existir antes de executar isso. O -n
é para testes, remova-o para realmente mover os arquivos.