GNU/Linux >> Znalost Linux >  >> Linux

atomic create soubor, pokud neexistuje z bash skriptu

Můžete jej vytvořit pod náhodně vygenerovaným názvem a poté přejmenovat (mv -n random desired ) jej na místo s požadovaným názvem. Pokud soubor již existuje, přejmenování se nezdaří.

Takhle:

#!/bin/bash

touch randomFileName
mv -n randomFileName lockFile

if [ -e randomFileName ] ; then
    echo "Failed to acquired lock"
else
    echo "Acquired lock"
fi

100% čistý bashový roztok:

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

Tento příkaz vytvoří soubor s názvem file pokud neexistuje žádný soubor s názvem file . Pokud existuje soubor s názvem file , pak neudělejte nic (ale vrátíte nenulový návratový kód).

Pros wrt the touch příkaz:

  • Neaktualizuje časové razítko, pokud soubor již existuje
  • 100% vestavěný bash
  • Vraťte kód podle očekávání:selže, pokud file již existuje nebo pokud file nemohl být vytvořen; úspěch, pokud file neexistoval a byl vytvořen.

Nevýhody:

  • potřebujete nastavit noclobber možnost (ale ve skriptu je to v pořádku, pokud si dáváte pozor na přesměrování, nebo ji poté zrušte).

Myslím, že toto řešení je skutečně bash protějšek open systémové volání s O_CREAT | O_EXCL .


Zde je funkce bash pomocí mv -n trik:

function mkatomic() {
  f="$(mktemp)"
  mv -n "$f" "$1"
  if [ -e "$f" ]; then
    rm "$f"
    echo "ERROR: file exists:" "$1" >&2
    return 1
  fi
}

Příklady:

$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo

Linux
  1. Zabránění souběžnému spuštění bash skriptu

  2. Bash Script:Zkontrolujte, zda je soubor textovým souborem?

  3. Spusťte bash skript z adresy URL

  1. Vytvořte nový soubor, ale přidejte číslo, pokud název souboru již v bash existuje

  2. přesunout pouze v případě, že soubor existuje ve skriptu shellu

  3. Vytvořte PEM ze souboru PPK

  1. Může být Bash skript připojen k souboru?

  2. Zjistěte, zda soubor existuje nebo ne v HDFS pomocí skriptu shellu

  3. bash + čtení proměnných a hodnot ze souboru pomocí bash skriptu