рекурсивно добавить имя каталога в имя файла

6

Учитывая следующую структуру:

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

Я хочу добиться следующего:

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

Другими словами, я хочу переместить все файлы, рекурсивно, из источника в пункт назначения, добавив исходное имя подкаталога в имя файла.

    
задан Catweasel 12.01.2017 в 00:38
источник

1 ответ

6

Использование Perl rename и 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 для тестирования, удалите его для фактического перемещения файлов.

    
ответ дан muru 12.01.2017 в 03:13
источник