Existe um comando para exibir a mensagem "Sim" se um arquivo específico existir? Não há necessidade de fornecer funcionalidade se o arquivo não existir.
command-line
James
fonte
fonte
[ -e FILENAME ] && echo Yes
FILENAME
for uma expansão variável ou contiver caracteres especiais, não esqueça de citá-la. por exemplo, em um script[ -e "$1" ] && echo Yes
.[[
e, em]]
vez de citar a variável.[[ ]]
, sempre citar é um bom hábito para iniciantes que não se lembram das regras especiais para dentro do[[ ]]
operador ou para contextos aritméticos.Você pode usar este script simples:
Salve como
file-exists.sh
. Em seguida, no terminal, digitechmod +x file-exists.sh
.Use-o como:
./file-exists.sh FILE
onde você substituiFILE
pelo arquivo que deseja verificar, por exemplo:Se
file.txt
existir,Yes
será impresso no terminal e o programa sairá com o status 0 (êxito). 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 eu incluí o
exit
comando, continue lendo ...O que há com o
exit
comando?exit
causa o término normal do processo. O que isso significa é, basicamente: ele interrompe 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
file-exists
script e é a maneira deles 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
):Faça o habitual
chmod +x file-exists-cli.sh
e, em seguida, executá-lo:./file-exists-cli.sh
. Você verá algo assim:O arquivo existe (
exit 0
):O arquivo não existe (
exit 1
):fonte
"$1"
. Se houver espaço em branco, ele será quebrado sem aspas e outras coisas ruins podem acontecer.No shell bash na linha de comando.
Isso usa o operador condicional do bash
-f
e está verificando se o arquivo existe e é um arquivo regular. Se você deseja testar qualquer arquivo, incluindo diretórios e links, use-e
.Este é um ótimo recurso para condicionais do bash.
fonte
test
no formato original, sei que é um exagero, mas é um hábito meu.[
comando, que geralmente chama de embutido.) Eles corrigem inconsistências e comportamentos mudos da versão de chave única. O [builtin permanece para compatibilidade, mas não vejo nenhuma boa razão para usá-lo no novo código bash. (Se você precisar escrever scripts POSIX que podem ser executados em escudos antigos ou algo assim, isso é diferente.)[
geralmente chama de embutido" é dúbio.type -a [
para mim lista "shell embutido" e depois "/usr/bin/[
."type
resultados parecem corroborar o que eu disse, não?O comando mais curto para fazer o que você deseja é:
test -e
testará se o nome fornecido existe no sistema de arquivos. (Você pode usartest -f
para restringir apenas a arquivos regulares. Vejaman test
para mais.)Se a condição fornecida for avaliada como verdadeira,
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 imprimeYes
na saída padrão; no caso de um shell interativo, no terminal.Isso evita o material textual adicional de uma
if
declaração, mas fornece o mesmo resultado. Usar&&
(ou seu oposto||
) para amarrar comandos funciona bem quando apenas um único comando está envolvido. Se você deseja fazer mais do que executar um único comando em resposta ao status de saída de um único comando, o uso daif
sintaxe rapidamente se torna muito mais legível.Como já apontado em outras respostas, a
if
construção de estilo equivalente seria:ou alternativamente:
Para esses fins,
[
etest
são equivalentes, exceto que[
exige uma rescisão]
.fonte
Para abordar esse tipo de pergunta, há várias maneiras, e aqui está outra: use
find
command com-exec
flag. O caminho para o arquivo pode ser dividido em duas partes,find /etc
que define o diretório e-name FILENAME
especifica o nome do arquivo (duh!).-maxdepth
continuaráfind
trabalhando/etc
apenas com o diretório e não descerá em subdiretóriosOutra maneira, via
stat
:E, alternativamente, via python:
Ou uma alternativa curta à linha de comando:
fonte