web-dev-qa-db-ja.com

ファイルが存在しない場合にファイルを作成するシェルスクリプト?

ファイルの存在を確認するシェルスクリプトを作成する必要があります。ファイルが存在しない場合は、ファイルを作成して次のコマンドに進むか、単に次のコマンドに進みます。私が持っているものはそれをしません。

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

返品は

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

何をすべきかわからない。グーグル検索が私をもたらすあらゆる場所は、異なる何かを示します。

24
jrw

おそらくより簡単なソリューションで、明示的なテストを行う必要はありません。使用するだけです。

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

既存のfile.txtの「変更」時刻をtouchで変更したくない場合は、touch -a /Scripts/file.txtを使用してtouchのみを変更できますアクセス」と「変更」の時間。

45
xenoid

_[_と_!_の間にスペースがないため、エラーが発生しますが、コードにもいくつかの欠陥があります。最初に、ファイルが存在しないかどうかを確認し、存在しない場合は何もしていません。ファイルが存在する場合は、ディレクトリを作成しています(ただし、ファイルを作成するために何もしていません)。

また、null演算は必要ありません。単純に次のことができるはずです。

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

[command2]
_

これは、_/Scripts/file.txt_が存在しないかどうかをチェックし、_/Scripts_ディレクトリを作成してから、_file.txt_ファイルを作成します。必要に応じて、ディレクトリの存在を個別に確認することもできます。さらに、私は_-e_の代わりに_-f_を使用していることに注意してください。_-e_がファイルの存在を確認するために_-f_がそれが「通常のファイル」 http://tldp.org/LDP/abs/html/fto.html

31
jesse_b

まず、シェルスクリプトbashスクリプトではないので、コードをより一般的にしましょう。

#!/bin/sh

すべてのPosixシステムにそのファイルが必要です。 bashは厳密にオプションです。

ディレクトリが存在するかどうかをテストする必要はありません。

dir=/Scripts
mkdir -p $dir

ファイルが存在しない場合に作成するには、

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

または、必要に応じて

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

構文エラーがあります。 []の前後にはスペースが必要です。

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"

上記は/Scripts/file.txtと呼ばれるdirectoryを作成するような「トリック」がないことを前提としています(これはcouldがスクリプトに常にifを入力させる方法です)ブランチ)。 「ファイル」がディレクトリの場合、-fテストは失敗し、touchコマンドは何も変更しません。

3
LSerni

私のアプローチ

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

出力

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

0
jmullee