Mover arquivos para o diretório pai, prefixando o nome do arquivo com o nome do subdiretório antigo [duplicado]

3

Eu tenho uma pasta parentdir com muitos diretórios como este:

$ tree parentdir/subdir_1

parentdir/subdir_1
├── important.txt
├── important_001.txt
├── important_002.log
├── important_007.bmp
├── something
├── else.mp3
├── nothing.000
└── ignore.me

O que eu quero é mover todos os arquivos com um nome começando com important para o diretório pai parentdir e renomeando-os prefixando cada nome de arquivo com o nome do subdiretório de onde eles vieram.

Por exemplo, parentdir/subdir_1/important_001.txt deve ser movido / renomeado para parentdir/subdir_1-important_001.txt .

Como posso executar mais facilmente essa operação de movimentação / renomeação em massa em um diretório enorme?

    
por Byte Commander 14.01.2017 / 17:19

1 resposta

5

Em parentdir você pode usar

for f in ./*/important*; do rename -n 's#\./([^/]+)/(.*)#-#' "$f" ; done

Remova -n após o teste para realmente mover e renomear

Explicação

  • s#old#new# replace old com new
  • \./([^/]+)/(.*) corresponde ao literal ./ , em seguida, salve alguns caracteres diferentes de / , combine / e salve o restante
  • - os dois padrões salvos separados por -

A desativação do separador de caminho move os arquivos para parentdir pela força

Considerações posteriores : mais simplesmente, neste caso, você poderia usar apenas s#/#-# para substituir / por - , omitindo ./ do início

for f in */important*; do rename -n 's#/#-#' "$f" ; done
    
por Zanna 14.01.2017 / 18:24