recursivamente adiciona o nome do diretório ao nome do arquivo

6

Dada a seguinte estrutura:

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

Eu quero alcançar o seguinte:

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

Em outras palavras, eu quero mover todos os arquivos, recursivamente, da origem para o destino, anexando o nome do subdiretório original ao nome do arquivo.

    
por Catweasel 12.01.2017 / 00:38

1 resposta

5

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.

    
por muru 12.01.2017 / 03:13

Tags