スクリプトがファイルを生成してはいけませんが、ファイルを生成しようとしていますか?

スクリプトがファイルを生成してはいけませんが、ファイルを生成しようとしていますか?

頻繁に移動するいくつかのフォルダを含むフォルダがあるため、そのフォルダが存在するかどうかを確認し、存在しない場合は生成するスクリプトを作成しました。これが私がしたことです。 (私の考えでは)達成できるようです。

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(ディレクトリ)に変更するだけです。

これにより問題が解決します。これで、人々がここに提供したヒントの一部に興味があるかもしれませんが、これは別々です。

関連情報