次の構造を考えます:
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)
正規表現(^|.*/)([^/]*)/([^/]*)
は、パスの最後の2つのコンポーネント(ファイル名と親ディレクトリ)を2番目と3番目に一致したグループとして保存します。
これを実行する前に、destination
ディレクトリが存在する必要があります。 -n
はテスト用で、実際にファイルを移動するために削除します。