Script de shell para criar um arquivo se ele não existir?

12

Eu preciso criar um script de shell que verifique a presença de um arquivo e, se ele não existir, crie-o e passe para o próximo comando ou simplesmente passe para o próximo comando. O que eu tenho não faz isso.

#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi

# Next command (macOS preference setting)
defaults write ...

O retorno é

line 5: [!: command not found
mkdir: /Scripts: File exists

Não faço ideia do que fazer. Cada lugar que uma pesquisa no Google me traz indica algo diferente.

    
por jrw 15.11.2017 / 20:30

6 respostas

33

Solução possivelmente mais simples, não é necessário fazer testes explícitos, apenas use:

mkdir -p /Scripts
touch /Scripts/file.txt

Se você não quiser que o tempo de "modificação" de um file.txt existente seja alterado em touch , você pode usar touch -a /Scripts/file.txt para fazer com que touch altere apenas os horários de "acesso" e "alteração" .

    
por 15.11.2017 / 22:37
23

Você está recebendo o erro porque não há espaço entre [ e ! , mas também há algumas falhas em seu código. Primeiro você está verificando se o arquivo não existe, e se não estiver fazendo nada. Se o arquivo existir você está fazendo um diretório (mas não fazendo nada para criar o arquivo).

Você também não precisa da operação nula, você deve ser capaz de simplesmente fazer:

#! /bin/bash -
if [[ ! -e /Scripts/file.txt ]]; then
    mkdir -p /Scripts
    touch /Scripts/file.txt
fi

[command2]

Isso está verificando se /Scripts/file.txt não existe, ele criará o diretório /Scripts e, em seguida, o arquivo file.txt . Você também pode verificar a existência do diretório separadamente, se quiser. Além disso, aviso estou usando -e em vez de -f como você pediu simplesmente para verificar a existência de um arquivo que é o que -e vai fazer onde -f verifica que é um "arquivo regular" link

    
por 15.11.2017 / 20:40
6

Você tem um erro sintático. Você precisa de espaços antes e depois do [ e ] .

    
por 15.11.2017 / 20:36
5

Para começar, script de shell não é bash script , então vamos tornar seu código mais geral:

#!/bin/sh

Todo sistema Posix deve ter esse arquivo; bash é estritamente opcional.

Não é necessário testar se o diretório existe, apenas

dir=/Scripts
mkdir -p $dir

Para criar o arquivo, se ele não existir,

filename=$dir/file.txt
test -f $filename || touch $filename

Ou se preferir,

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi
    
por 16.11.2017 / 23:05
3
#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
CHECKFILE="/Scripts/file.txt"

CHECKDIR=$( dirname "$CHECKFILE" )

# The directory with the file must exist
mkdir -p "$CHECKDIR"
if [ ! -f "$CHECKFILE" ]; then
    # What to do if the file is not there
fi
touch "$CHECKFILE"

O acima assume que não existem "truques" como a criação de um diretório chamado /Scripts/file.txt (que poderia ser uma forma de forçar o script a entrar sempre no se ramo). Se o "arquivo" for um diretório, o teste -f falhará e o comando de toque não alterará nada.

    
por 15.11.2017 / 22:25
0

minha abordagem

#!/bin/sh

# input might contains spaces and other characters
FILEPATH="/tmp/some where/the file.blah"

# extract the file + dir names
FILE="'basename "${FILEPATH}"'"
DIR="'dirname "${FILEPATH}"'"

# create the dir, then the file
mkdir -p "${DIR}" && touch "${DIR}/${FILE}"

# show result
ls -l "$FILEPATH"

saída

  ./dofile.sh
  -rw-r--r-- 1 jmullee jmullee 0 Nov 15 21:23 /tmp/some where/the file.blah

.

    
por 15.11.2017 / 22:27