如何使用一个Perl命令创建目录和父目录?

18
在 Perl 中,我应该如何创建子目录,并且如果它们不存在的话同时创建父目录呢?就像 UNIX 的 mkdir -p 命令一样?

添加了这个问题,以便将来能够轻松地找到它,而不是每次都查找。出于某种原因,我总是在 POSIX.pm 中寻找它。 - skiphoppy
5个回答

30
use File::Path qw(make_path);
make_path("path/to/sub/directory");

被弃用的mkpath和推荐使用的make_path源自于Perl 5 Porters线程中的讨论,该线程已经存档 这里

简而言之,Perl 5.10测试发现了makepath()接口参数解析的笨拙性。 因此,它被替换为一个更简单的版本,该版本将哈希作为最后一个参数以设置函数选项。


4
@skiphoppy在问题中提到的"类似于UNIX的mkdir -p命令",但这个函数还不够相似。mkdir的手册页显示:<code>-p,--parents 不出错,如有必要,则创建父目录</code>但是如果目录存在,make_path会返回false。(例如,make_path“/tmp/foo”或die;#如果/tmp/foo存在则会死机) - Randall

3
使用File::Path模块中的mkpath函数:
use File::Path qw(mkpath);
mkpath("path/to/sub/directory");

2
刚刚做了一下研究,我发现mkpath()已经弃用了,官方接口现在是make_path()。如果有人能写出一个很好的解释说明这给我们带来了什么,我将把它作为被接受的答案。 - skiphoppy

3

如果您正在寻找具有“mkdir -p”功能的Perl模块,请忽略此内容,但以下代码可以正常工作:

my $dir = '/root/example/dir';

system ("mkdir -p $dir 2> /dev/null") == 0 
    or die "failed to create $dir. exiting...\n";

你可以使用一个模块,但是你必须在每个要迁移代码的服务器上安装它。对于像创建目录这样的工作,我通常更喜欢使用系统函数,因为只需要在需要时调用一次模块来创建目录,而不需要导入和调用模块的开销较小。


如果你想避免安装模块,那种方法是有道理的。我通常更喜欢要求安装我需要的模块,否则我会拒绝支持该系统。 :) 我喜欢使用模块,这样我就可以获得测试和研究的好处,避免像未检查系统调用或丢失错误消息输出等错误,并且因为不需要创建进程,所以开销更小。 - skiphoppy
1
这难道不会对操作系统产生依赖吗? - Peter Mortensen

0

0

mkdir() 函数允许您在 Perl 脚本中创建目录。

示例:

use strict;
use warnings;

my $directory = "tmp";

unless(mkdir($directory, 0755)) {
        die "Unable to create $directory\n";

该程序创建一个名为“tmp”的目录,并将权限设置为0755(只有所有者有写入目录的权限;组成员和其他人只能查看文件和列出目录内容)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接