web-dev-qa-db-ja.com

ディレクトリ名をファイル名に再帰的に追加します

次の構造を考えます:

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

私は次を達成したい:

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

つまり、すべてのファイルをソースから宛先に再帰的に移動し、元のサブディレクトリ名をファイル名に追加する必要があります。

5
Catweasel

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はテスト用で、実際にファイルを移動するために削除します。

5
muru