Script tenta criar arquivos mesmo que não seja necessário?

4

Eu tenho uma pasta que contém algumas pastas, essas pastas são movidas com muita freqüência, então eu fiz um script para ver se elas existem, e se não, crie-as. Isto é o que eu fiz para (o que eu acho que seria):

if [ ! -f "$DIR/0folder" ]
then
mkdir "$DIR/0folder"
fi

Mas, mesmo que 0folder já exista, ele ainda tenta fazer com que mkdir me diga. Como aqui;

mkdir: /Allfoldersgoeshere/subfolder/0folder: File exists

Por quê? Deveria apenas ignorá-lo porque já existe?

    
por DisplayName 07.04.2015 / 22:34

5 respostas

12

O -f em seu teste está verificando se FILE existe e é um arquivo regular . O que você precisa é de -d para testar se FILE existe e é um diretório .

if [ ! -d "$DIR/0folder" ]
then
mkdir "$DIR/0folder"
fi

Não é obrigatório verificar se existe um diretório. De acordo com a página do manual de mkdir , vemos o seguinte

man mkdir | grep -A1 -- -p

   -p, --parents
          no error if existing, make parent directories as needed

No entanto, se FILE existir e for um arquivo normal mkdir -p falhará com

mkdir: /Allfoldersgoeshere/subfolder/0folder': Not a directory.  

Nesse cenário, é necessário manipular o file que deve ser um directory antes da criação do diretório.

    
por 07.04.2015 / 22:39
3

Do manual ( man bash ) em EXPRESSÕES CONDICIONAIS:

-f file
          True if file exists and is a regular file.

-d file
          True if file exists and is a directory.

Então, para verificar a existência de um diretório (não um arquivo) ...

if [[ ! -d "$DIR/0folder" ]] ; then
    mkdir "$DIR/0folder"
fi
    
por 07.04.2015 / 22:42
3

Nenhum-d ou -f é útil aqui para testes robustos - porque eles são lados opostos da mesma moeda.

touch file; [ ! -d file ] && mkdir file
mkdir: cannot create directory ‘file’: File exists

Veja? Melhor seria [ -e ... ] || mkdir ... verificar existência , o que salvaria pelo menos o erro acima, mas mesmo isso tem seus problemas - como condições de corrida ou não criação de pais conforme necessário ou links simbólicos não resolvidos.

if    [ ! -e "$DIR/0folder" ] && 
      [ ! -L "$DIR/0folder" ] 
then  mkdir -- "$DIR/0folder"
fi

... está mais perto, mas ainda atrevido e ainda assume que todos os pais também existem.

Provavelmente, você poderia ter certeza de que test , se necessário, mas você realmente não sabe. Você pode obter a criação do diretório atômico com mkdir -p e testar seu retorno. Não existem muitas ferramentas padrão de shell que oferecem operações operacionais atômicas - é melhor aproveitarmos as vantagens de fazer isso.

    
por 08.04.2015 / 04:38
2

Leia o manual. A opção -p criará um diretório e diretórios intermediários conforme necessário, se ele não existir ou falhar silenciosamente. Supondo que você não esteja processando milhares de arquivos, você pode fazer apenas mkdir -p "${DIR}/0folder ou se você precisar testar

 [ -d "${DIR}/0folder" ] || mkdir -p "${DIR}/0folder"
    
por 07.04.2015 / 22:51
1

Você está fazendo: se a pasta $ DIR / 0 não existir, crie um diretório com esse nome.

Apenas altere -f (arquivo) por -d (diretório).

Isso deve resolver o seu problema, agora você pode se interessar por algumas dicas que as pessoas deram aqui, mas que estão separadas.

    
por 08.04.2015 / 05:11