Remove todos os caracteres especiais recursivamente do nome de arquivo [duplicado]

0

Eu tenho vários arquivos em diretórios e subdiretórios que possuem caracteres especiais não suportados pelos compartilhamentos de arquivos da Microsoft e pelo SharePoint. Os tipos de personagens percorrem a gama de tis para e comercial para quem sabe o que. Eu usei comandos como:

find . -type f -print | while read file
do
  file_clean=$( echo ${file} | tr " \~()&'" "_____" )
  mv $file $file_clean
done

e veja que alguns sugeriram usar globstar. Mas ainda não consigo encontrar um comando relativamente simples para remover todos os caracteres especiais, deixando apenas A-Z, a-z, 0-9 recursivamente (recursivamente parece ser a parte mais difícil).

    
por SMDouk 23.03.2016 / 17:59

3 respostas

0

Para obter todos os nomes de arquivos, você deve confiar em sequências nulas delemitadas:

find /your/path/ -print0 | while read -r -d $'
find /your/path/ -print0 | while read -r -d $'%pre%' filename; do
    dn="'dirname "$filename"'"
    bn="'basename "$filename"'"
    bn_clean="'echo "$bn" | tr " \~()&'" "_______"'"
    file_clean="$dn/$bn_clean"
    if [ "$filename" != "$file_clean" ] ; then
        mv -fv "$filename" "$file_clean"
    fi
done
' filename; do dn="'dirname "$filename"'" bn="'basename "$filename"'" bn_clean="'echo "$bn" | tr " \~()&'" "_______"'" file_clean="$dn/$bn_clean" if [ "$filename" != "$file_clean" ] ; then mv -fv "$filename" "$file_clean" fi done
    
por 23.03.2016 / 22:57
0

Cuidado com isso:

perl -pi -e 's/\W//g' $(find . -type f)

Você pode fazer backups com algo como:

perl -pi.bak -e 's/\W//g' $(find . -type f)
    
por 24.03.2016 / 01:08
0

A maneira mais fácil é com zsh . O Zsh faz parte da instalação básica do OS X, mas precisa ser instalado através do gerenciador de pacotes na maioria das distribuições Linux e instalado a partir das portas no * BSD. O Zsh fornece a função zmv que facilita muitas tarefas de renomeação de arquivos. Primeiro, execute isto (ou coloque-o no seu .zshrc , para uso interativo):

autoload zmv

Então você pode usar

zmv '(**/)(*)' '$1${2//[^A-Za-z0-9]/_}'

ou o equivalente

zmv '**/*' '$f:h${${f:t}//[^A-Za-z0-9]/_}'

O primeiro comando zmv renomeia todos os arquivos que correspondem **/* (ou seja, todos os arquivos no diretório atual e em subdiretórios recursivamente), em arquivos no mesmo diretório ( $1 ) e com o nome base transformado para substituir cada caractere correspondente [^A-Za-z0-9] por _ . Os parênteses em (**/)(*) fazem com que a parte do diretório do caminho (tudo até o último / ) seja atribuído a $1 e o nome base do arquivo como $2 . O segundo comando faz o mesmo, mas usa $f para se referir a todo o nome original e aos modificadores :h e :t para extrair o diretório e as partes básicas do nome.

Seu script é dividido em todos os tipos de formas, porque ele executa vários caracteres especiais por meio do tratamento de shell, em vez de tratá-los literalmente. Para entender por que, leia meu shell script engasga com espaço em branco ou outros caracteres especiais?

    
por 24.03.2016 / 00:34

Tags