Procurando por um script para converter um nome de arquivo com barras invertidas em uma estrutura de diretórios com arquivos

2

No momento, estamos testando um novo aplicativo no Linux que anteriormente funcionava no Windows. Parece que havia alguns caminhos codificados no programa e um monte de arquivos de teste com nomes extensos de arquivos com barras invertidas foram criados. Por exemplo:

directory\subdirectory\subdirectory\subdirectory\filename.ext

Eu preciso pegar esses arquivos, criar o diretório em que eles deveriam estar e movê-los para lá. Por exemplo, o arquivo acima deve estar:

directory/subdirectory/subdirectory/subdirectory/filename.ext

Como posso fazer isso?

    
por Andy P 12.07.2017 / 16:28

2 respostas

2

Se você precisar renomear todos arquivos cujo nome contém \ , você pode fazer:

for file in *\*; do 
    dir="$(dirname -- "${file//\/\/}")"
    filename="${file##*\}"
    mkdir -p -- "$dir"
    mv -- "$file" "$dir"/"$filename"
done

Explicação

  • for file in *\* : O glob *\* corresponde a qualquer nome de arquivo ou diretório no diretório atual cujo nome contenha \ . Como o \ também é o caractere de escape, precisamos evitá-lo para que seja tratado como um literal. É por isso que não podemos usar apenas *\* .

    Em seguida, iterará todos os arquivos e diretórios cujo nome contenha \ , salvando cada um deles como $file .

  • dir="$(dirname "${file//\/\/}")" : ${file//\/\/} imprimirá o nome do arquivo atual com todos os \ substituídos por / . O escape \ e \/ ) é necessário, pois os caracteres \ e / são especiais. dirname imprime o diretório no qual um arquivo está contido. Por exemplo, dirname /path/to/file retornará /path/to . Portanto, $dir será o diretório de destino para o qual moveremos este arquivo.
  • filename=${file##*\} : o nome do arquivo, com tudo antes do último \ removido. Este é o nome real do arquivo e será salvo como $filename .
  • mkdir -p "$dir" : crie o diretório de destino e todos os seus pais. O -p torna mkdir criar os diretórios pais (sem que mkdir foo/bar não funcione, a menos que foo/ já exista) e também ignora os erros sobre o diretório já existente.
  • mv "$file" "$dir"/"$filename" : a etapa final, mova o arquivo para o local correto.
por 12.07.2017 / 16:55
1
prename 'mkdir $' while s[\][/]' *\*

Em que prename é o utilitário Perl, às vezes chamado rename também. O modelo básico de operação deste comando é que os nomes dos arquivos que precisam ser alterados são fornecidos através de sua linha de comando, no nosso caso *\* irá alimentar todos os nomes de arquivos que tenham pelo menos uma barra invertida em seus nomes.

Em seguida, o código presente nas aspas simples é aplicado nos nomes dos arquivos um a um e o que resulta em $_ é o novo nome do arquivo.

Nós configuramos um loop while que progressivamente muda uma barra invertida uma vez para uma barra e cria um diretório apontado pelo $ 'var que é a parte pré-correspondência da string.

Quando saímos do loop while, o $_ contém    diretório / subdiretório / subdiretório / subdiretório / filename.ext e é para isso que o original é renomeado agora que os dirs / subdirs agora existem.

    
por 13.07.2017 / 07:43