web-dev-qa-db-fra.com

Script shell pour créer un fichier s'il n'existe pas?

J'ai besoin de créer un script Shell qui vérifie la présence d'un fichier et s'il n'existe pas, le crée et passe à la commande suivante, ou passe simplement à la commande suivante. Ce que j'ai ne fait pas ça.

#!/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 ...

Le retour est

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

Je ne sais pas quoi faire. Chaque endroit où une recherche Google m'amène indique quelque chose de différent.

24
jrw

Solution peut-être plus simple, pas besoin de faire des tests explicites, utilisez simplement:

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

Si vous ne voulez pas l'heure de "modification" d'un file.txt à modifier par touch, vous pouvez utiliser touch -a /Scripts/file.txt pour que touch ne change que les heures "access" et "change".

45
xenoid

Vous obtenez l'erreur car il n'y a pas d'espace entre [ et ! cependant il y a aussi quelques défauts dans votre code. Vous vérifiez d'abord si le fichier n'existe pas et sinon vous ne faites rien. Si le fichier existe, vous créez un répertoire (mais vous ne faites rien pour créer le fichier).

Vous n'avez pas non plus besoin de l'opération null, vous devriez pouvoir simplement faire:

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

[command2]

Ceci vérifie si /Scripts/file.txt n'existe pas, il créera le /Scripts répertoire puis le file.txt fichier. Vous pouvez également vérifier l'existence du répertoire séparément si vous le souhaitez. Notez également que j'utilise -e au lieu de -f comme vous l'avez demandé simplement pour vérifier l'existence d'un fichier qui est ce que -e fera où -f vérifie qu'il s'agit d'un "fichier normal" http://tldp.org/LDP/abs/html/fto.html

31
jesse_b

Pour commencer, script Shell n'est pas script bash, nous allons donc rendre votre code plus général:

#!/bin/sh

Chaque système Posix doit avoir ce fichier; bash est strictement facultatif.

Pas besoin de tester si le répertoire existe, juste

dir=/Scripts
mkdir -p $dir

Pour créer le fichier s'il n'existe pas,

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

Ou si vous préférez,

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi
14
James K. Lowden

Vous avez une erreur syntaxique. Vous avez besoin d'espaces avant et après le [ et ].

6
DopeGhoti
#!/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"

Ce qui précède suppose qu'il n'y a pas de "trucs" tels que la création d'un répertoire appelé /Scripts/file.txt (qui pourrait être un moyen de forcer le script à toujours entrer dans la branche if). Si le "fichier" est un répertoire, le test -f échouera et la commande tactile ne changera rien.

3
LSerni

mon approche

#!/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"

production

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

.

0
jmullee