find não gera codigo de erro no $?

1. find não gera codigo de erro no $?

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/09/2023 - 16:48h

# O find não gera código de erro

find "$HOME/.fonts" -iname "Anonymous Pro Bold.woff2"


# Verdadeiro ou falso no find sempre gera código 0

# echo $?
# 0


# Mesmo gerando o código de erro 1 não cai no else

if [ "$?" = "1" ] ;
then

echo "$?"

zenity --title "$title_errors" --timeout 15 --error --text="$fonte_encontrada" 2> /dev/null

exit

else

cp "Anonymous Pro Bold.woff2" "$HOME/.fonts" | zenity --progress --title "$title_ok - $fonte" --text "$copying_fonts" --auto-close --auto-kill --width="500" 2>/dev/null


fi


O script é para verificar se a fonte já existe no sistema. Se não tiver instala.


  


2. Re: find não gera codigo de erro no $?

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 13/09/2023 - 16:48h

O comando `find` retorna código de saída 0 se todos os arquivos foram processados com sucesso, código maior que 0 se ocorrerem erros. É importante notar que 'arquivo não encontrado' não é considerado um erro pelo `find`. Portanto, se o arquivo que você está procurando não existir, o `find` ainda retornará 0.

Fazemos a verificação se o arquivo já existe no sistema usando o mesmo comando `find` mas ao invés de esperar que ele retorne um código de erro, verificamos se a saída da busca é vazia.

Se a saída do `find` não for vazia, significa que a fonte já existe no sistema e você pode pular a etapa de instalação. Caso contrário, você deve mover para a instalação da fonte.

Veja a reformulação do script para se adequar a isso:

[code]
# Busca pela fonte
fonts=$(find "$HOME/.fonts" -iname "Anonymous Pro Bold.woff2")

# Verifica se a saída do find é vazia
if [ -z "$fonts" ] ; then

#Instala a fonte
cp "Anonymous Pro Bold.woff2" "$HOME/.fonts" | zenity --progress --title "$title_ok - $fonte" --text "$copying_fonts" --auto-close


3. Re: find não gera codigo de erro no $?

aguamole
aguamole

(usa KUbuntu)

Enviado em 13/09/2023 - 18:43h

Cara parece que tem um problema na lógica ai, o find sempre vai dar verdadeiro mesmo que o arquivo não seja encontrado, ele so vai da outro valor de 0 se ele não conseguir completar a operação.
Vlw. A mas a alexa já te aviso sobre esse erro de lógica.


4. Re: find não gera codigo de erro no $?

aguamole
aguamole

(usa KUbuntu)

Enviado em 13/09/2023 - 19:17h

@Minions Minha sugestão:
 [[ -e "/${HOME}/.fonts/Anonymous Pro Bold.woff2" ]] && echo "arquivo existe" || echo "arquivo não existe"  

Você pode trocar o -e por: -d -e -f e outros.
Segue o manual do Bash: "6.4 Bash Conditional Expressions" em https://www.gnu.org/software/bash/manual/bash.html
É isso.


5. Re: find não gera codigo de erro no $?

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/09/2023 - 19:18h

@alexabolada


O comando basename pode gera problema com o comando find?


6. Re: find não gera codigo de erro no $?

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 13/09/2023 - 19:18h

Olá! A interação entre os comandos basename e find do Linux geralmente funciona bem juntos. Mas, pode ocorrer problemas se os nomes dos arquivos que você está procurando incluírem caracteres especiais, como espaços.

O comando find percorrerá os diretórios em busca de arquivos que correspondam ao padrão especificado.

Por exemplo, se quisermos encontrar todos os arquivos com extensão .js, pode usar:

find / -name "*.js"

Entretanto, o basename retornará o último nome do diretório/componente do nome do arquivo do caminho do nome especificado. Assim, se o nome do arquivo contiver espaços, o basename poderá não funcionar corretamente. Uma solução alternativa seria usar aspas.

Por exemplo:

basename "/caminho/do/seu arquivo"

Espero ter ajudado! Para mais dúvidas, é só falar!


7. Re: find não gera codigo de erro no $?

aguamole
aguamole

(usa KUbuntu)

Enviado em 13/09/2023 - 19:26h

@Minions a formula que eu passei é built-in do Bash, não sei se você entende o que é built-in mas é um comando interno do interpretador Bash.


8. Re: find não gera codigo de erro no $?

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/09/2023 - 19:36h


aguamole escreveu:

@Minions Minha sugestão:
 [[ -e "/${HOME}/.fonts/Anonymous Pro Bold.woff2" ]] && echo "arquivo existe" || echo "arquivo não existe"  

Você pode trocar o -e por: -d -e -f e outros.
Segue o manual do Bash: "6.4 Bash Conditional Expressions" em https://www.gnu.org/software/bash/manual/bash.html
É isso.



A ideia para verifica se o arquivo existe desta forma seria legal mas nos gostamos mesmo que criar varias pastas e subpastas em ~/.fonts e jogar as fontes na pasta especifica. Por isso o uso do find ou grep para essa tarefa.

Agora mesmo fiz uma busca por arquivos duplicados em ~/.fonts... Tem muitos arquivos repetidos kkkkk





9. Re: find não gera codigo de erro no $?

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/09/2023 - 19:43h


alexabolada escreveu:

Olá! A interação entre os comandos basename e find do Linux geralmente funciona bem juntos. Mas, pode ocorrer problemas se os nomes dos arquivos que você está procurando incluírem caracteres especiais, como espaços.





LEGAL

Achei o problema do find esta localizando o arquivo e não copiando o arquivo para a pasta ~/.fonts

Arquivo com nome composto não funciona nem usando o " " na variável?



10. Re: find não gera codigo de erro no $?

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 13/09/2023 - 19:43h

Boa pergunta! De fato, a interação com o comando find pode se tornar complicada quando os nomes dos arquivos que estamos lidando possuem espaços ou caracteres especiais.

Quando um arquivo com espaços ou caracteres especiais é passado para o comando find, ele tratará cada palavra como um argumento separado, o que pode causar erros. No entanto, existem formas de contornar isso.

Aqui está uma maneira de lidar com nomes de arquivo que contenham espaços usando o find com o xargs:

find . -name 'NOME DO ARQUIVO' -print0 | xargs -0 -I {} cp {} ~/.fonts
 


O parâmetro -print0 especifica que o output do find será delimitado por um NULL character (caractere nulo) - necessário para nomes de arquivo com espaços.

O -0 no xargs indica que esse caractere terminará cada entrada.

Espero que isso te ajude!


11. Re: find não gera codigo de erro no $?

Morpheus
Minions

(usa Nenhuma)

Enviado em 14/09/2023 - 00:07h



@alexabolada

Tem outra forma de localizar arquivo com nome composto em uma pasta sem usar o find?


12. Re: find não gera codigo de erro no $?

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 14/09/2023 - 00:08h

Olá!

Sim, existe outra forma de localizar arquivos com nomes compostos em uma pasta sem usar o comando find. Você pode utilizar o comando ls com a função de pesquisa (wildcards).

Por exemplo, se quisermos localizar um arquivo chamado
documento-de-texto.txt 
podemos usar:

$ ls *documento-de-texto.txt

O caracter * é usado como um wildcard, representando qualquer caractere. Ele permite que você localize arquivos sem precisar do nome completo.

Vale lembrar que este comando listará os arquivos no diretório atual. Se você quiser procurar o arquivo em subdiretórios, aí sim vai ser necessário utilizar o find ou um comando similar.

Espero que isso ajude!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts