仅当目录尚不存在时如何 mkdir?

问:

我正在编写一个在 AIX 上的 KornShell (ksh) 下运行的 shell 脚本。我想使用 mkdir 命令创建一个目录。但是该目录可能已经存在,在这种情况下我不想做任何事情。所以我想测试一下目录不存在,或者抑制 mkdir 在尝试创建现有目录时抛出的“文件存在”错误。

我怎样才能最好地做到这一点?

答1:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

试试 mkdir -p:

mkdir -p foo

请注意,这也会创建任何不存在的中间目录;例如,

mkdir -p foo/bar/baz

将创建目录 foo、foo/bar 和 foo/bar/baz(如果它们不存在)。

像 GNU mkdir 这样的一些实现包括 mkdir --parents 作为更易读的别名,但这在 POSIX/Single Unix 规范中没有指定,并且在许多常见平台上不可用,如 macOS、各种 BSD 和各种商业 Unix,所以它应该是避免。

如果想在父目录不存在时报错,如果目录不存在则想创建目录,那么可以先test判断目录是否存在:

[ -d foo ] || mkdir foo

您使用的缩短示例正是您不应该做的。它正在反转逻辑以节省编码空间,但它应该使用!和 && 对阅读它的人来说更有意义。

@AndreasLarsen 这个问题是关于类 Unix 系统上的 mkdir 的,而不是 Windows 上的。 -p 是 POSIX/单一 Unix 规范合规性所必需的,因此任何旨在遵守这些规范的东西都将支持 -p。 Windows 是完全不同的,除非您使用像 Cygwin 或 MSYS 这样的 POSIX 仿真层。

我今天用 mkdir -p 发现了一些有趣的东西,你可以使用括号! {} 在命令中创建“复杂”目录树。见这里:technosophos.com/2010/04/15/…

@MikeQ 我更喜欢 || 而不是 && 因为这样整行就有正确的退出状态。如果您的 shell 使用 errexit 运行,或者该行是函数、switch-case 等中的最后一行,则很重要。

@herve 这与 mkdir 无关; shell 将这样的表达式扩展为传递给 mkdir 的离散参数列表。

答2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

这应该有效:

$ 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

如果目录不存在,它将创建该目录,但如果您尝试创建的目录的名称已被目录以外的其他对象使用,则会警告您。

我认为 korn 中没有 -d 运算符,而是 -e 用于文件/目录,只是检查存在。此外,它们在成功时都返回 0,所以!是多余的。如我错了请纠正我。

在这两个方面都错了,AFAIK。测试成功时返回 true,并且 -d 也存在(至少在 MacOS X 上)

值得一提的是,这不是线程安全的。在您检查目录是否存在和您尝试写入之间,情况可能会发生变化。

答3:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

使用 -p 标志。

man mkdir
mkdir -p foo

-p, --parents 如果存在则没有错误,根据需要创建父目录

答4:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

使用一个命令定义复杂的目录树

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

如果存在则没有错误,根据需要创建父目录

请记住,这不是 mkdir 本身的功能,而是执行命令的 shell。它被称为大括号扩展 - AFAIK,只有 Bash、ksh、zsh 和 C shell 支持它。

如果逗号周围有空格,您可能(将)得到意想不到的结果。谨防。

@Atlas7 声明,您需要转义通常属于正则表达式的字符。 (即您需要使用 folder\ name 而不是使用 folder name)

这不是答案;这是一个单独的主题,更适合作为评论。

答5:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

如果您不想显示任何错误消息:

[ -d newdir ] || mkdir newdir

如果你想显示你自己的错误信息:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

但是subject to race conditions?

@PeterMortensen:当然。如果您不想要竞争条件,请使用 mkdir -p。但是您不会显示自己的 Directory exists 错误。

答6:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

即使目录存在,mkdir foo 也能正常工作。要使其仅在名为“foo”的目录不存在时才起作用,请尝试使用 -p 标志。

例子:

mkdir -p foo

只有当它不存在时,才会创建名为“foo”的目录。 😃

正如@BrianCampbell 所提到的,这还将在路径中创建任何其他目录。如果卷被卸载,这可能是危险的,因为它可能会在安装点创建目录。

答7:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

旧的尝试和真实

mkdir /tmp/qq >/dev/null 2>&1

将在许多其他解决方案都没有的竞争条件下做你想做的事。

有时最简单(也是最丑陋)的解决方案是最好的。

如果“tmp”不存在,这将失败。它也没有给你任何确认。

比赛条件?你能详细说明你的答案吗?非原子测试和创建?

@Peter,一个像(例如)[ -d newdir ] || mkdir newdir这样的片段,其中目录最初不存在,有一个竞争条件,在存在测试和尝试创建之间,另一个进程可以突然进入并创建目录。因此 mkdir 将失败。

@Mike Q:示例中可能选择了基本路径 /tmp 来表示始终存在并且对当前用户可写的基本路径,例如,用户有足够的权限在其中创建目录。您提出一个有效的观点::逻辑有点矛盾,因为当这个命令失败时,它可能意味着两件事:1.)目录存在或2.)目录无法创建。这不适用于操作本身,因此对目录路径进行简单的后检查可以给出确认,或者下一个操作的命令。

mkdir -p /tmp/qq > /dev/null 2>&1 将创建 /tmp/ 如果缺少。

答8:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

您可以使用 if 语句来检查目录是否存在。如果它不退出,则创建目录。

dir=/home/dir_name 如果 [ ! -d $dir ] 然后 mkdir $dir else echo “Directory exists” fi 您可以使用带有 -p 选项的 mkdir 来创建目录。它将检查目录是否不可用。 mkdir -p $dir mkdir -p 还允许创建目录的树结构。如果要使用相同的命令创建父目录和子目录,可以选择 mkdir -p mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

使用 if 循环有什么好处!?为什么有人会选择 -p 选项?!

我已经分享了当文件夹不存在时创建文件夹的方法。这取决于对一个人的要求。如果您有一个用例,您需要检查文件夹是否不存在并且您想跟踪它,以便您可以使用解决方案 1。如果没关系,您可以使用解决方案 2,它将创建文件夹如果不存在。

答9:

huntsbot.com – 高效赚钱,自由工作

mkdir 在 Windows 8+ 系统上不再支持 -p 开关。

你可以使用这个:

IF NOT EXIST dir_name MKDIR dir_name

OP 是关于 AIX kornshell 的……与 Windows 无关,是吗?

你确定它以前支持过吗?你有资源吗?

答10:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

答11:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

简单、沉默和致命:

mkdir -p /my/new/dir >/dev/null 2>&1

应该是: mkdir -p /my/new/dir >/dev/null 2>&1

如果 my/new/dir 已经存在,mkdir -p my/new/dir 不会抱怨,无需重定向输出

错字已修复。 Leevi,我相信我遇到了需要压制输出的情况。

天真的 Windows 用户注意:当文件夹存在时,-p 在 Windows 上仍然失败

原文链接:https://www.huntsbot.com/qa/1jXm/how-to-mkdir-only-if-a-directory-does-not-already-exist?lang=zh_CN&from=csdn

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值