desarrollo-web-br-bd.com

¿Script de Shell para crear un archivo si no existe?

Necesito crear un script de Shell que verifique la presencia de un archivo y, si no existe, lo crea y pasa al siguiente comando, o simplemente pasa al siguiente comando. Lo que tengo no hace eso.

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

El retorno es

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

Ni idea de qué hacer. Cada lugar que me trae una búsqueda de Google indica algo diferente.

24
jrw

Posiblemente una solución más simple, no es necesario hacer pruebas explícitas, solo use:

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

Si no desea que touch cambie el tiempo de "modificación" de un file.txt Existente, puede usar touch -a /Scripts/file.txt Para hacer que touch solo cambie los tiempos de "acceso" y "cambio".

45
xenoid

Recibes el error porque no hay espacio entre [ y ! sin embargo, también hay algunos defectos en su código. Primero está verificando si el archivo no existe, y si no está haciendo nada. Si el archivo sí existe, está creando un directorio (pero no está haciendo nada para crear el archivo).

Tampoco necesita la operación nula, simplemente debería poder hacer:

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

[command2]

Esto está comprobando si /Scripts/file.txt no existe, creará el /Scripts directorio y luego el file.txt archivo. También puede verificar la existencia del directorio por separado si lo desea. Además aviso que estoy usando -e en lugar de -f como pediste simplemente para verificar la existencia de un archivo que es lo que -e hará donde -f comprueba que es un "archivo normal" http://tldp.org/LDP/abs/html/fto.html

31
jesse_b

Para empezar, script de Shell no es script de bash, así que hagamos que su código sea más general:

#!/bin/sh

Todos los sistemas Posix deben tener ese archivo; bash es estrictamente opcional.

No es necesario probar si el directorio existe, solo

dir=/Scripts
mkdir -p $dir

Para crear el archivo si no existe,

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

O si lo prefieres

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

Tienes un error sintáctico. Necesita espacios antes y después del [ y ].

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"

Lo anterior supone que no hay "trucos" como crear un directorio llamado /Scripts/file.txt (que podría ser una forma de obligar al script a ingresar siempre la rama if). Si el "archivo" es un directorio, la prueba -f fallará y el comando táctil no cambiará nada.

3
LSerni

mi acercamiento

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

salida

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

.

0
jmullee