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


19

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

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

何をすべきかわかりません。Google検索がもたらすすべての場所は、何か違うことを示しています。


6
コードをshellcheck.netに入れて、提案を確認します
roaima

12
touchファイルだけで条件をスキップできない理由はありますか?
kirkpatt

以下のその他の回答では、構文エラー([との間のスペースが欠落してい!ます)を取り上げています[が、ここでUnixの実際のコマンドであると指摘しておくと役立つでしょう。Unixコマンドでは、コマンド名とその引数の間に空白が必要です。はい、Bash ビルトインでもありますが、/usr/bin/[ほとんどのシステムにはバイナリもあります。
-TheDudeAbides

回答:


43

おそらくより単純なソリューション、明示的なテストを行う必要はなく、単に使用します:

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

既存の「修正」時間たくない場合file.txtによって変更するにtouchは、使用することができますtouch -a /Scripts/file.txt作るためにtouchのみ「アクセス」と「変更」の時間を変更します。


1
mtimeを気にしない場合は、を使用できます>>/Scripts/file.txt。これにより、ファイルが追加用に開かれ、存在しない場合は作成されます。
小次郎

29

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

また、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代わりに、「通常のファイル」http://tldp.org/LDP/abs/html/ftoであることを確認する場所で行う-fファイルの代わりに使用しています。 html-e-f


ありがとう、@ roaima、あなたの提案で答えを更新しました。
Jesse_b

ファイルは存在しませんが、ディレクトリは存在しますか?
アリ

3
@Ant:mkdir -p:既に存在する場合に文句を言うことなく、必要なすべてのディレクトリを作成します。例:mkdir / home / user1 / tmp:/ homeまたは/ home / user1ディレクトリが事前に存在していたという事実とは無関係に、この階層を作成します。touchは、既存のファイルの時刻を更新するだけで、ファイルが存在しない場合は新しいファイルを作成します。これらのディレクトリが存在し、そのファイルがその中に存在することを確認したい場合は、これら2つのコマンドを起動するだけで十分なので、if ... then部分を削除することもできます。
オリビエデュラック

そうですか!明確化していただきありがとうございます:)
Ant

11

まず、シェルスクリプト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

6

構文エラーがあります。あなたは前後にスペースを必要と[して]


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"

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


0

私のアプローチ

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


1
ファイルが存在するかどうかを確認していない
-PiedPiper

@piepdpiper彼は、これは暗黙的でtouchあり、mkdir -p
-xenoid

より多くのチェックを行う同じアイデアは次のようになります:D = / boot / bork; F = fnord; mkdir -p "$ D" && {"$ D / $ F"にタッチ&& echo "$ D / $ Fを作成OK"; } || {echo "dir '$ D'を作成できませんでした"; }
jmullee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.