ワンライナーをバッシュして、ファイルが存在しない場合にアトミックに作成します


9

ファイルが存在しない場合に自動的にファイルを作成するBashワンライナーが必要です。つまり、「ファイルが存在しない場合は作成する」ということですが、ifを実行してからファイルを作成するまでの間に、他のユーザーが小さなスペースでファイルを作成できないようにします。


「アトミック」を「自動」と読みました。回答を削除しました。
アーロンコプリー2016年

回答:


6

さまざまなコメントや[SO]へのリンクから回答盗む。そこにあると思われるPOSIX準拠した方法で関与していないmkdir、私は以下の私のオリジナルの答えで述べたように

set -o noclobber # or set -C
{ > file ; } &> /dev/null

このファイルへのリダイレクトは0を返すか失敗し、ファイルが既に存在する場合はゼロ以外を返します。


元の答え

使用する必要がありますmkdir-これはアトミックです。ディレクトリが作成されて続行できるか、作成されないため、適切なアクションを実行します。

もちろん、mkdirはファイルを作成しませんが、ディレクトリへの排他的アクセス権があることがわかったら、必要なファイルをそのディレクトリに作成できます。

ワンライナーについて-それはあなたにお任せします。個人的には、保守しやすくなるように、数行で記述します。


しかし、stackoverflow.com / q / 13828544/1207760からのnoclobber は、OPが望んでいる以上のものです。
法律29 2016年

一般的に、Noclobberは良い答えです。ただし、ksh88では機能しません。
jrw32982は

1
@JohnWiersbaですが、問題はbashについてです。
ウォンブル

@wombleはい、しかし答えはPOSIXについて言及しており、誰かの答えは他のシェルにも当てはまるという意味です。Ksh88は、一部のサーバーでは標準シェルです。
jrw32982は

0

それはファイルまたはディレクトリですか?ファイルの場合、単純なコマンドtouchを使用できます。ファイルが存在する場合は、最終アクセス時刻を変更するだけです。ファイルが存在しない場合は作成されます。


0

これを試してみてください。lnテスト・アンド・セットの機能を提供します。

touch lock.$$.tmp
if ln lock.$$.tmp lock.dat 2>/dev/null
then
    echo "File is mine"
else
    echo "Test and set failed"
fi
rm -f lock.$$.tmp

0

ファイル名を気にしない場合は、このタスクをユーティリティ(たとえば、mktemp)に委任できます。

Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied.  Files are created u+rw, and directories u+rwx, minus umask
restrictions.

呼び出し:

filename=$(mktemp)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.