Remover acentos e caracteres especiais de diretórios e arquivos recursivamente

1. Remover acentos e caracteres especiais de diretórios e arquivos recursivamente

FABIO RODRIGUES PINTO
FABIO_GYN

(usa Debian)

Enviado em 13/09/2019 - 22:24h

Boa noite a todos,

Estou escrevendo um script para organizar meus vários HD's de backup, sei que já tem coisa pronta por ai, mas para praticar quero fazer.

Basicamente, gero uma listagem de arquivos com hash md5sum e os comparo, o que tiverem hash iguais, são repetidos e posso deletar, em seguida separo a lista agrupando os repetidos e depois, marco os arquivos que desejo deletar e/ou manter (Basta mudar o código, depende de qual opção vai ser menos trabalhosa).

Há também uma comparação (em desenvolvimento) de listas de outros HD's para que somente um arquivo seja mantido em todos os HD's de backup.

Uma coisa que está pegando é remover acentos de diretórios e arquivos, testei com iconv, outras opções e não deram certo para tudo.

Gostaria de ajuda também porque em cada função a solução que encontrei foi gerar uma relação em txt, gostaria de uma forma de não gerar essa quantidade de arquivos txt.

Outras observações e sugestões serão bemvindas, valeu !!!

Segue o script, há muito a arrumar, fiz um esqueleto e fui mudando ao longo do desenvolvimento.

#!/usr/bin/env bash

## CABEÇALHO ##
###############
#Criado por Fabio Rodrigues Pinto
#Shell script para normatizar arquivos
#
#
#
#
#
#
################

## INSTRUÇÕES ##
################
#
#
#
#
#

## VARIÁVEIS ##
###############
#
#param1
diret=$1;
#filetocompate=$2;
#
#
#
###############

## DIRETÓRIOS

## ARQUIVOS ##
##############
#
#
#
#
#
#
#echo "Testando: $#";

## FUNÇÕES ##
#############INÍCIO


function _logando()
{
if [ -e "$diret/0_relatorio.log" ];
then

echo "O arquivo de logs existe.";

else

touch "$diret/0_relatorio.log";
fi;

tee -a > "$diret/0_relatorio.log";

};


function _removeSpacesDir()
{

find "$diret" -type d | rename 's/ /_/g' >> "$diret/1_relacao-diretorios.txt";

};


function _removeSpacesFiles()
{

find "$diret" -type f | rename 's/ /_/g' >> "$diret/1_relacao-arquivos.txt";

};


function _removeAccents()
{

find "$diret" -type d | iconv -t 'ascii//TRANSLIT';
find "$diret" -type f | iconv -t 'ascii//TRANSLIT';

#for dir in "!(*([[:graph:]]))";
#do
#mudar=$(mv "$dir" "${dir//[^[:graph:]]/_}");
#echo $mudar;
#done;

};


function _listFiles()
{

find "$diret" -type f -exec md5sum {} \; > "$diret/1_relacao-arquivos.txt";

qtd_files=$(cat "$diret/1_relacao-arquivos.txt" | wc -l);

echo "Há $qtd_files arquivos no volume $diret." | _logando;
echo "";
sleep 1;

};

function _groupRepeateds()
{

cat "$diret/1_relacao-arquivos.txt" | sort | uniq -w 32 --all-repeated=separate > "$diret/2_relacao-arquivos.txt";

};


function _markRepeatedtsoDel()
{

grep "^#" "$diret/2_relacao-arquivos.txt" > "$diret/3_relacao-arquivos.txt";

qtd_repetidos=$(cat "$diret/3_relacao-arquivos.txt" | wc -l);

echo "Há $qtd_repetidos arquivos repetidos no volume $diret."; # | _logando;
echo "";
sleep 1;

};


function _unmarkRepeatedtsoDel()
{
exec 3<"$diret/3_relacao-arquivos.txt";

while read file <&3;
do

echo "$file" | cut -d" " -f3 >> "$diret/4_relacao-arquivos.txt"

done;

exec 3<&-;

#for file in $(cat "$diret/3_relacao-arquivos.txt");
#do

#echo ${file:1} >> "$diret/4_relacao-arquivos.txt";

#done;


files_repeteads=$(cat "$diret/4_relacao-arquivos.txt" | wc -l);

echo "Serão deletados $files_repeteads arquivos repetidos no volume $diret."; # | _logando;
echo "";
sleep 2;

};

function _liststoCompare()
{

echo "Informe o caminho e o nome da listagem geral de arquivos: ";
read filetocompate;

exec 3<"$diret/4_relacao-arquivos.txt";



while read arquivotocompare <&3;
do
echo $arquivotocompare;
#grep "arquivotocompare" $filetocompate;


done;

exec 3<&-;
};


function _delrepeatedfiles()
{

exec 3<"$diret/4_relacao-arquivos.txt";

while read filetodelete <&3;
do

a_executar="rm $filetodelete";
echo "Deletando o arquivo: $a_executar"; # | _logando;
rm "$filetodelete";

done;

exec 3<&-;
};




#Menu select

function _menu_select()
{
echo "";
PS3='Por favor selecione a ação desejada: ';
echo "";

#my_array[0]=foo;
#my_array[1]=bar;

#options=("Remover espaços de nomes de diretórios" "Remover espaços de nomes de arquivos" "Remover acentos e caracteres especiais"
#"Listar todos os arquivos com md5sum" "Agrupar arquivos repetidos separadamente" "Opção Invalida" "Quit");

options[0]="Option 01: Remover espaços de nomes de diretórios";
options[1]="Option 02: Remover espaços de nomes de arquivos";
options[2]="Option 03: Remover acentos e caracteres especiais";
options[3]="Option 04: Listar todos os arquivos com md5sum";
options[4]="Option 05: Agrupar arquivos repetidos separadamente";
options[5]="Option 06: Separar arquivos marcados para deleção";
options[6]="Option 07: Separar md5sum do arquivo";
options[7]="Option 08: Comparar listas de arquivos";
options[8]="Option 09: Deletar arquivos repetidos";
options[9]="Option 10: Quit";
#options[9]="Option 9: Opção Invalida $REPLY";


select opt in "${options[@]}";
do
case $opt in

"Option 01: Remover espaços de nomes de diretórios")

echo "";
echo "Removendo espaços dos nomes de diretórios, aguarde...";
_removeSpacesDir;
echo "Pronto!";
echo "";

;;

"Option 02: Remover espaços de nomes de arquivos")

echo "";
echo "Removendo espaços dos nomes de diretórios, aguarde...";
_removeSpacesFiles;
echo "Pronto!";
echo "";

;;

"Option 03: Remover acentos e caracteres especiais")

echo "";
echo "Removendo acentos de nomes de arquivos e diretórios";
_removeAccents;
echo "Pronto!";
echo "";

;;

"Option 04: Listar todos os arquivos com md5sum")

echo "";
echo "Gerando relação de arquivos repetidos, aguarde...";
_listFiles;
echo "Pronto!";
echo "";

;;

"Option 05: Agrupar arquivos repetidos separadamente")

echo "";
echo "Agrupando arquivos repetidos, aguarde...";
_groupRepeateds;
echo "Pronto!";
echo "";

;;

"Option 06: Separar arquivos marcados para deleção")

echo "";
echo "Separando arquivos marcados para serem deletados, aguarde...";
_markRepeatedstoDel;
echo "Pronto!";
echo "";

;;

"Option 07: Separar md5sum do arquivo")

echo "";
echo "Separando hash md5sum do caminho e nome do arquivo, aguarde...";
_unmarkRepeatedtsoDel;
echo "Pronto!";
echo "";

;;

"Option 08: Comparar listas de arquivos")

echo "";
echo "Comparando a lista geral de arquivos com a lista do scaneamento atual, aguarde...";
_liststoCompare;
echo "Pronto!";
echo "";

;;

"Option 09: Deletar arquivos repetidos")

echo "";
echo "Deletando os arquivos repetidos encontrados, aguarde...";
_delrepeatedfiles;
echo "Pronto!";
echo "";

;;

"Option 10: Quit")

echo "";
echo "Saindo...Tchau!";
echo "";
break;

;;

*)

echo "";
echo "Invalid option: $REPLY - Digite uma opção válida!";
echo "";

;;

esac;
done;
};


#### MAIN ####
##############

#echo "Exibindo o numero do parametro: $#";

if [ "$#" -eq "0" ];
then

echo -e "ERROR: Execute o script fornecendo um diretório-alvo como primeiro parâmetro para busca de arquivos repetidos.\n
Exemplo: "$0" <Diretório-desejado>";
echo "";
sleep 1;
exit 1;

else

_menu_select;

fi;


  


2. Re: Remover acentos e caracteres especiais de diretórios e arquivos recursivamente

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/09/2019 - 14:51h

Boa tarde Fabio.
Sugestões:

#PEGA ARQUIVOS/DIRETÓRIOS, COM ESPAÇO NO NOME e troca por "_"
for i in *' '* ;do
mv "$i" "${i// /_}" ;
done


#Identifica/Lista Arquivos/Diretórios com caracteres especiais no nome:
find /home/user/ -maxdepth 1 -iname "*"|grep -E '[áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚçÇ]' 


#Altera caractere especial
iconv -f UTF8 -t ASCII//TRANSLIT <<< "/home/user/MACARRÃO"
/home/user/MACARRAO

Importante => echo -e "$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')"
Att.: Marcelo Oliver






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts