頻繁に移動するいくつかのフォルダを含むフォルダがあるため、そのフォルダが存在するかどうかを確認し、存在しない場合は生成するスクリプトを作成しました。これが私がしたことです。 (私の考えでは)達成できるようです。
if [ ! -f "$DIR/0folder" ]
then
mkdir "$DIR/0folder"
fi
しかし、0folder
すでにそこにいるのに、まだmkdir
私に言おうとしています。ここのように。
mkdir: /Allfoldersgoeshere/subfolder/0folder: File exists
なぜ?すでに存在しているので無視する必要がありますか?
答え1
テストで-f
次のことを確認しています。FILE
存在し、通常のファイルです。。あなたが必要とするのは、-d
次のことをテストすることです。FILE
存在し、ディレクトリです。
if [ ! -d "$DIR/0folder" ]
then
mkdir "$DIR/0folder"
fi
ただし、ディレクトリが存在することを確認する必要はありません。マニュアルページによると、mkdir
次のことがわかります。
man mkdir | grep -A1 -- -p
-p, --parents
no error if existing, make parent directories as needed
しかし、FILE
存在し、通常のファイルです。 mkdir -p
失敗するだろう
mkdir: /Allfoldersgoeshere/subfolder/0folder': Not a directory.
この場合、file
ディレクトリを作成する前に予想されるaを処理する必要があります。directory
答え2
~から手動man bash
()条件式で:
-f file
True if file exists and is a regular file.
-d file
True if file exists and is a directory.
したがって、ファイルではなくディレクトリが存在することを確認するには...
if [[ ! -d "$DIR/0folder" ]] ; then
mkdir "$DIR/0folder"
fi
答え3
-d
-f
あるいは、ここは同じコインの両面にすぎず、強力なテストには役に立ちません。
touch file; [ ! -d file ] && mkdir file
mkdir: cannot create directory ‘file’: File exists
願いより?[ -e ... ] || mkdir ...
確認することをお勧めします存在する、これは少なくとも上記のエラーを防止しますが、これにも競合状態があるか、必要に応じて親を生成しない、または解決されていないシンボリックリンクなどの問題があります.
if [ ! -e "$DIR/0folder" ] &&
[ ! -L "$DIR/0folder" ]
then mkdir -- "$DIR/0folder"
fi
...もっと近いが、まだエレガントではなく、まだすべての親が存在すると仮定します。
必要であれば確信できますが、test
実際にはそうではありません。アトミックディレクトリ生成を使用し、mkdir -p
その戻り値をテストできます。原子的なfs操作を提供する標準的なシェルツールはあまりありません。私たちはこれらのツールを活用することをお勧めします。
答え4
あなたがやっていることは、$ DIR / 0フォルダが存在しない場合は、その名前のディレクトリを作成することです。
-f(ファイル)を-d(ディレクトリ)に変更するだけです。
これにより問題が解決します。これで、人々がここに提供したヒントの一部に興味があるかもしれませんが、これは別々です。