move arquivos com caracteres especiais para o novo diretório

1

Eu estou tentando escrever um loop para um script que verifica um diretório específico para quaisquer caracteres especiais e move esses arquivos para um diretório específico (exceto espaços e hífens - esses são simplesmente substituídos por sublinhados e mantidos nesse diretório e eu Obtive esse script feito). Eu observei várias possibilidades que encontrei aqui e no Stack overflow, que são correspondências próximas, mas não consigo fazer com que nenhuma delas funcione como eu preciso.

    for i in /home/*; do

            case $i in
                 *\?*||*\**||*\$*||*\%*||*\.*||*\'*||*\"*||*\**||*\,* )
            mv home/failed;
            esac

    done

Não precisa ser nada assim se houver uma maneira mais curta ou melhor de conseguir isso.

Obrigado antecipadamente, vocês são ótimos! Eu aprendi mais informações práticas de vasculhar o Stack Overflow, U & L, etc. do que um bacharelado em TI me ensinou.

    
por SomeGuy 06.05.2016 / 17:47

2 respostas

1

A coisa a ser cuidadosa aqui é que os nomes dos arquivos unix podem conter caracteres com qualquer valor de caractere de 8 bits, exceto '/' e '\ 0'.

Se você quiser mover qualquer arquivo que tenha um caractere que não esteja em [A-Z] ou [a-z] ou um sublinhado, use o seguinte:

for file in /home/*; do
    filename=${file##*/}
    [ -n "${filename//[A-Za-z_]/}" ] && mv "$file" failed/
done

Funciona primeiro removendo o caminho do diretório, deixando apenas o nome do arquivo. Em seguida, elimina todos os caracteres 'legais' do nome do arquivo. Se algum caractere permanecer, o nome do arquivo conterá um caractere ilegal e será movido.

    
por 15.06.2016 / 18:24
0

Isso deve poder ser modificado para ser usado em um script, mas se você estiver fazendo isso a partir da linha de comando, poderá fazer ls -i . Isso fornecerá o inode para cada arquivo no diretório. A partir disso você pode usar find:

find ./ -i $INODE -exec mv {} <target> \;

    
por 06.05.2016 / 19:14