脚本尝试创建文件,即使它不应该这样做?

脚本尝试创建文件,即使它不应该这样做?

我有一个包含一些文件夹的文件夹,这些文件夹经常被移动,所以我制作了一个脚本来查看它们是否存在,如果不存在则创建它们。这就是我所做的(我认为会)实现它:

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

但并不强制检查目录是否存在。根据man pagemkdir我们看到以下内容

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.  

在这种情况下,在创建目录之前需要处理预期的filea 。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 操作的标准 shell 工具并不多 - 我们最好利用那些提供原子操作的工具。

答案4

您正在做的事情是:如果 $DIR/0 文件夹不存在,则使用该名称创建一个目录。

只需将 -f (文件)更改为 -d (目录)即可。

这应该可以解决您的问题,现在您可能会对人们在这里给出的一些提示感兴趣,但这是分开的。

相关内容