Você pode fazer isso em etapas, criando uma lista dos arquivos e o novo nome para cada um. Você provavelmente teria que criar os diretórios de destino primeiro. Se a estrutura do diretório for relativamente plana, você poderá fazer isso manualmente com mkdir -p path
. Se houver muitos diretórios, mas eles não contiverem espaços ou caracteres de destino ilegais que você possa usar (digamos de / dvd para / media)
cd /media ; ( cd /dvd ; find . -type d ) | xargs mkdir -p
Isso coloca você no diretório de destino (pronto para o mkdir
) e, em seguida, lista todos os diretórios abaixo do diretório de origem, enviando-os para mkdir
. Você pode usar find
option -print0
juntamente com xargs
option -0
se precisar de espaços nos nomes de diretório.
Em seguida, use find
para criar a lista de arquivos a serem copiados, digamos com
cd /dvd ; find . -type f | sed 's/\(.*\)/cp "" ""/' > /tmp/copy.sh
Em seguida, edite o arquivo /tmp/copy.sh
, substituindo todos os caracteres ilegais nos nomes de destino. Para cada nome de arquivo, o comando sed
insere cp
antes dele e, em seguida, o nome do arquivo entre aspas duplas (origem) e o nome do arquivo entre aspas duplas novamente (destino). Uma vez que você tenha essa aparência aceitável, torne o copy.sh
executável e execute-o.
Aviso de isenção: como sempre, é possível copiar arquivos para o lugar errado, preencher um sistema de arquivos, etc, então tente alguns comandos manualmente e verifique o resultado antes de executar uma massa inteira deles. Você pode testar o comando xargs mkdir
tentando xargs echo mkdir
primeiro para ver o que ele fará.