Comando para exibir uma mensagem arbitrária se um determinado arquivo existir

11

Existe um comando para exibir a mensagem "Sim" se um determinado arquivo existir? Não há necessidade de fornecer funcionalidade se o arquivo não existir.

    
por james 14.06.2016 / 18:58

5 respostas

25

Use este simples one-liner Bash:

if [ -e FILENAME ] ; then echo Yes ; fi

A verificação -e é avaliada como verdadeira se FILENAME existir, não importa o que seja (arquivo, diretório, link, dispositivo, ...).

Se você quiser apenas verificar arquivos regulares, use -f , como @Arronical disse.

    
por Byte Commander 14.06.2016 / 19:05
10

Você pode usar este script simples:

#!/bin/bash

if [[ -f  ]]; then
    echo "Yes"
    exit 0
else
    exit 1
fi

Salve como file-exists.sh . Em seguida, no Terminal, digite chmod +x file-exists.sh .

Use como: ./file-exists.sh FILE , onde você substitui FILE pelo arquivo que deseja verificar, por exemplo:

./file-exists.sh file.txt

Se file.txt existir, Yes será impresso no Terminal e o programa sairá com o status 0 (sucesso). Se o arquivo não existir, nada será impresso e o programa sairá com o status 1 (falha).

Se você está curioso para saber por que incluí o comando exit , continue a ler ...

O que há com o comando exit ?

exit causa a finalização normal do processo. O que isto significa é, basicamente: ele pára o script. Ele aceita um parâmetro opcional (numérico) que será o status de saída do script que o chamou.

Esse status de saída permite que seus outros scripts usem seu script file-exists e sua maneira de saber se o arquivo existe ou não.

Um exemplo simples que coloca isso em uso é esse script (salve-o como file-exists-cli.sh ):

#!/bin/bash

echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run 'file-exists.sh' but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
    echo "$FILE exists"
else
    echo "$FILE does not exist"
fi

Execute o usual chmod +x file-exists-cli.sh e, em seguida, execute-o: ./file-exists-cli.sh . Você verá algo assim:

O arquivo existe ( exit 0 ):

➜  ~ ./file-exists-cli.sh 
Enter a filename and I will tell you if it exists or not: 
booleans.py
booleans.py exists

O arquivo não existe ( exit 1 ):

➜  ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not: 
asdf
asdf does not exist
    
por grooveplex 14.06.2016 / 19:09
9

No shell bash na linha de comando.

if [[ -f /path/to/file ]]; then echo "Yes"; fi

Isso usa o operador condicional bash -f e está verificando se o arquivo existe e é um arquivo regular. Se você quiser testar quaisquer arquivos, incluindo diretórios e links, use -e .

Este é um ótimo recurso para os condicionais bash.

    
por Arronical 14.06.2016 / 19:03
5

O comando mais curto para fazer o que você quer é:

test -e FILENAME && echo Yes

test -e testará se o nome dado existe no sistema de arquivos. (Você pode usar test -f para restringir apenas a arquivos regulares. Veja man test para mais.)

Se a condição fornecida for avaliada como verdadeira, então test retornará um status de saída bem-sucedido (caso contrário, retornará um status de falha). Combinamos os dois comandos usando && , o que significa "executar o próximo comando se o comando anterior sair com um status de sucesso". O próximo comando simplesmente imprime Yes na saída padrão; no caso de um shell interativo, no terminal.

Isso evita o material textual adicional de uma instrução if , mas fornece o mesmo resultado. Usar && (ou seu oposto, || ) para unir comandos funciona bem quando apenas um único comando está envolvido. Se você quiser fazer mais do que executar um único comando em resposta ao status de saída de um único comando, usar a sintaxe if rapidamente se tornará muito mais legível.

Como já foi apontado em outras respostas, a construção equivalente do estilo if seria:

if test -e FILENAME; then echo Yes; fi

ou alternativamente:

if test -e FILENAME
then
    echo Yes
fi

Para essas finalidades, [ e test são equivalentes, exceto que [ exige uma ] final.

    
por Michael Kjörling 15.06.2016 / 15:35
4

Para eliminar esse tipo de pergunta, há várias maneiras, e aqui está outra: use o comando find com -exec flag. O caminho para o arquivo pode ser dividido em duas partes find /etc , que define o diretório e -name FILENAME , que especifica o nome do arquivo (duh!). -maxdepth manterá find trabalhando apenas com o diretório /etc e não entrará em subdiretórios

adminx@L455D:~$ find /etc -maxdepth 1  -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1  -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$ 

Outra maneira, via stat :

adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES

E, alternativamente, via python:

>>> import os
>>> if os.stat('/etc/passwd'): 
...    print 'YES'
... 
YES
>>> if os.stat('/etc/passwd1'): 
...    print 'YES'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'

Ou uma alternativa de linha de comando curta:

 python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
    
por Sergiy Kolodyazhnyy 14.06.2016 / 21:48