我有一个包含一些文件夹的文件夹,这些文件夹经常被移动,所以我制作了一个脚本来查看它们是否存在,如果不存在则创建它们。这就是我所做的(我认为会)实现它:
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.
在这种情况下,在创建目录之前需要处理预期的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 操作的标准 shell 工具并不多 - 我们最好利用那些提供原子操作的工具。
答案4
您正在做的事情是:如果 $DIR/0 文件夹不存在,则使用该名称创建一个目录。
只需将 -f (文件)更改为 -d (目录)即可。
这应该可以解决您的问题,现在您可能会对人们在这里给出的一些提示感兴趣,但这是分开的。