私は、AIX上でKornシェル(ksh)の下で実行するためのシェルスクリプトを書いています。ディレクトリを作成するにはmkdir
コマンドを使用します。しかし、ディレクトリはすでに存在しているかもしれません。その場合私は何もしたくありません。そのため、そのディレクトリが存在しないことを確認するか、既存のディレクトリを作成しようとしたときにmkdir
がスローする "File exists"エラーを抑制します。
これを行うための最良の方法について何か考えはありますか?
mkdir -p
:を試してください。
mkdir -p foo
これによって、存在しない中間ディレクトリも作成されます。例えば、
mkdir -p foo/bar/baz
ディレクトリfoo
、foo/bar
、およびfoo/bar/baz
が存在しない場合は作成します。
GNU mkdir
のような実装には、もっと読みやすい別名としてmkdir --parents
が含まれていますが、これはPOSIX /シングルUnix仕様では規定されていない避けるべきです。
親ディレクトリが存在しないときにエラーが発生し、存在しない場合はディレクトリを作成したい場合は、まずディレクトリの存在として test
を実行します。
[ -d foo ] || mkdir foo
これはうまくいくはずです。
$ mkdir -p dir
または
if [[ ! -e $dir ]]; then
mkdir $dir
Elif [[ ! -d $dir ]]; then
echo "$dir already exists but is not a directory" 1>&2
fi
これはディレクトリが存在しない場合は作成しますが、作成しようとしているディレクトリの名前がすでにディレクトリ以外のもので使用されている場合は警告を出します。
-pフラグを使用してください。
man mkdir
mkdir -p foo
1つのコマンドで複雑なディレクトリツリーを定義する
mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
エラーメッセージを表示したくない場合は、
[ -d newdir ] || mkdir newdir
あなた自身のエラーメッセージを表示したい場合:
[ -d newdir ] && echo "Directory Exists" || mkdir newdir
昔ながらの真実
mkdir /tmp/qq >/dev/null 2>&1
他の解決策の多くが持っている競争条件のどれもなくあなたが望むことをするでしょう。
時には最も簡単な(そして最も醜い)解決策が最善です。
mkdir foo
は、ディレクトリが存在する場合でも機能します。 「foo」という名前のディレクトリが存在しない場合にのみ機能させるには、-p
フラグを使用してみてください。
例:-
mkdir -p foo
これにより、「foo」という名前のディレクトリが存在しない場合にのみ作成されます。 :)
directory_name = "foo"
if [ -d $directory_name ]
then
echo "Directory already exists"
else
mkdir $directory_name
fi
または、まず存在を確認したい場合は、
if [[ ! -e /path/to/newdir ]]; then
mkdir /path/to/newdir
fi
-e はkornシェルの存在テストです。
ゴーンシェルマニュアルをグーグルで試すこともできます。
windows 8以降のシステムでは、mkdirは-pスイッチをサポートしなくなりました。
これを使うことができます:
IF NOT EXIST dir_name MKDIR dir_name
Ifループを使用して、ディレクトリが存在するかどうかを確認することができます。存在しない場合は、ディレクトリを作成するよりも終了することはできません。
1)dir =/home/dir_name
if [ ! -d $dir ]
then
mkdir $dir
else
echo "Directory exists"
fi
2)mkdirに-pオプションを付けてディレクトリを作成することができます。ディレクトリが利用できないかどうかをチェックします。
mkdir -p $dir
mkdir -pでは、ディレクトリのツリー構造も作成できます。同じコマンドを使用して親ディレクトリと子ディレクトリを作成したい場合は、mkdir -pを選択できます。
mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
mkdir -p sam
これは単純な関数(bashシェル)で、ディレクトリが存在しない場合は作成できます。
#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
if [ ! -d $1 ]
then
mkdir -p $1
fi
}
あなたは上記の関数を呼び出すことができます:
createDirectory/tmp/fooDir/BarDir
上記の例では、fooDirとBarDirが存在しなければ作成します。ディレクトリを再帰的に作成するmkdirコマンドの "-p"オプションに注意してください。お役に立てれば。
オプション-p
についてはmanページman mkdir
を参照
-p, --parents
no error if existing, make parent directories as needed
指定されたパスにすべてのディレクトリを作成し、existsがエラーをスローしなければ、指定されたパスの左から右にすべてのディレクトリを作成します。下記のコマンドを試してください。このコマンドを発行する前に、ディレクトリnewdir
とanotherdir
が存在しません。
正しい使い方
mkdir -p /tmp/newdir/anotherdir
このコマンドを実行すると、/ tmpの下にnewdir
とanotherdir
が作成されたことがわかります。このコマンドは何度でも発行できます。コマンドには常にexit(0)
があります。このため、ほとんどの人は実際のパスを使用する前にシェルスクリプトでこのコマンドを使用します。