2013-09-04 19 views
53

W moim skryptu bash zrobić:mkdir Tylko jeśli nie istnieje

mkdir product; 

Kiedy uruchomić skrypt więcej niż raz uzyskać:

mkdir: product: File exists 

w konsoli.

Tak więc szukam tylko uruchomienia mkdir, jeśli katalog nie istnieje. czy to możliwe?

+1

mkdir product 2>/dev/null – dcaswell

Odpowiedz

121

Wykonaj test

[[ -d dir ]] || mkdir dir 

też użyć opcji -p:

mkdir -p dir 
+2

Nie mogę znaleźć źródła w locie, ale dla Makefiles 'mkdir -p' jest zniechęcany b/c mogą występować warunki wyścigu podczas równoczesnej realizacji. Tak więc, w zależności od tego, co robi skrypt i w jakim środowisku żyje, pierwszą opcją jest ta opcja. Możesz także po prostu "mkdir product 2>/dev/null" i nie obchodzi. – user1129682

+1

@ user1129682: Pierwsza opcja ma również potencjalny stan wyścigu; katalog mógłby zostać utworzony przez jakiś inny proces pomiędzy testem '-d' i' mkdir'. Podejrzewam, że 'mkdir -p' sprawia, że ​​okno tego czasu jest nieco krótsze. –

+0

Oprócz warunków wyścigu w niepotrzebnych testach istnieje również możliwość, że 'dir' istnieje **, ale nie jest katalogiem **, ale plikiem lub wpisem urządzenia lub gniazdem domeny unixowej lub nazwanym potokiem, lub _whatever_ ... – wildplasser

3

mkdir -p

-p, --parents żaden błąd, jeśli istnieją, jak tworzyć katalogi nadrzędne potrzebne

8

Użyj opcji mkdir's -p, ale zauważ, że ma również inny efekt.

-p  Create intermediate directories as required. If this option is not specified, the full path prefix of each oper- 
     and must already exist. On the other hand, with this option specified, no error will be reported if a directory 
     given as an operand already exists. Intermediate directories are created with permission bits of rwxrwxrwx 
     (0777) as modified by the current umask, plus write and search permission for the owner. 
2

Spróbuj użyć tego: -

mkdir -p dir; 

UWAGA: - Będzie to również tworzyć żadnych pośrednich katalogów, które nie istnieją; na przykład

Wyjazd mkdir -p

lub spróbuj tego: -

if [[ ! -e $dir ]]; then 
    mkdir $dir 
elif [[ ! -d $dir ]]; then 
    echo "$Message" 1>&2 
fi 
40
if [ ! -d directory ]; then 
    mkdir directory 
fi 

lub

mkdir -p directory 

-p zapewnia tworzenie jeśli directory nie istnieje

+2

Jeden liniowiec wymaga dodatkowego ';': 'if [! -d katalog]; następnie katalog mkdir; fi' – sdgfsdh

Powiązane problemy