Isso pode funcionar para você:
find . -type f -name "*.png" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
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?
find -type f -name '*.png' -printf '%Pfind -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
%P
informe find
para omitir o primeiro ./
;
tell find
ASCII NUL
para imprimir os caminhos usando o caractere -d $'
como separador (isso deve evitar problemas com nomes estranhos ); bash
'
${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.
Este canal pode envolver substituições de arquivos, certifique-se de tomar as devidas precauções.
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