Achatar uma estrutura de pastas para um nome de arquivo no Bash

4

Estou tentando converter arquivos dessa estrutura:

foldera/folderb/filec.png

para:

foldera_folderb_filec.png

Estou no meio do caminho:

 find . -type f -name "*.png" | sed 's@^./@@g;s@/@-@g'

que basicamente converte a estrutura de nomes. No entanto, não faz a cópia ainda. Neste momento estou preso. Como posso expandir o script para realmente executar as operações de cópia?

    
por reinier 04.03.2012 / 22:38

3 respostas

1

Isso pode funcionar para você:

find . -type f -name "*.png" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
    
por 06.03.2012 / 21:05
1
find -type f -name '*.png' -printf '%P
find -type f -name '*.png' -printf '%P%pre%' | \
while read -d $'%pre%' i ; do cp "$i" "${i////_}" ; done
' | \ while read -d $'%pre%' i ; do cp "$i" "${i////_}" ; done

Onde:

  • %P informe find para omitir o primeiro ./ ;

  • find tell ASCII NUL para imprimir os caminhos usando o caractere -d $'bash' como separador (isso deve evitar problemas com nomes estranhos );

  • ${i////_} tell bash para usar o delimitador apropriado para ler os caminhos;

  • / tell _ para substituir todas as ocorrências de %code% por %code% no caminho.

Aviso:

Este canal pode envolver substituições de arquivos, certifique-se de tomar as devidas precauções.

    
por 06.03.2012 / 22:57
1

Isso funcionou bem para mim. Ele elimina o prefixo ._, mas é o mesmo que a resposta de potong .

find . -type f -name "*" | sed 's/$/"/;s/^/"/;h;s/^...//;s/^/"/;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
    
por 27.01.2015 / 18:06

Tags