我有一个带有一些参数的Perl脚本。它执行如下:
exec myscript.pl --file=/path/to/input/file --logfile=/path/to/logfile/logfile.log
我在脚本中有以下行:
open LOGFILE, ">>$logFilePath" or die "Can't open '$logFilePath': $!\n";
从命令行中取$logfilePath
的位置。
如果有一个路径,/ path /到/ logfile /,但没有logfile.log,它只是创建它(这是所需的操作)。但是,如果没有这样的路径,它就无法启动。如果脚本在运行脚本之前不存在,如何创建日志文件的路径?
答案 0 :(得分:22)
假设您在变量logfile.log
中有日志文件的路径(可能包含或不包含文件名:$full_path
)。然后,您可以根据需要创建相应的目录树:
use File::Basename qw( fileparse );
use File::Path qw( make_path );
use File::Spec;
my ( $logfile, $directories ) = fileparse $full_path;
if ( !$logfile ) {
$logfile = 'logfile.log';
$full_path = File::Spec->catfile( $full_path, $logfile );
}
if ( !-d $directories ) {
make_path $directories or die "Failed to create path: $directories";
}
现在,$full_path
将包含logfile.log
文件的完整路径。路径中的目录树也已创建。
答案 1 :(得分:7)
更新:正如Dave Cross指出的那样,mkdir
只创建一个目录。因此,如果您想一次创建多个级别,这将无效。
使用Perl的mkdir
命令。例如:
#Get the path portion only, without the filename.
if ($logFilePath =~ /^(.*)\/[^\/]+\.log$/)
{
mkdir $1 or die "Error creating directory: $1";
}
else
{
die "Invalid path name: $logFilePath";
}
使用perl自己的函数比运行unix命令更好。
编辑:当然,您还应该先检查目录是否存在。使用-e
检查是否存在某些内容。将其添加到上面的代码中:
#Get the path portion only, without the filename.
if ($logFilePath =~ /^(.*)\/[^\/]+\.log$/)
{
if (-e $1)
{
print "Directory exists.\n";
}
else
{
mkdir $1 or die "Error creating directory: $1";
}
}
else
{
die "Invalid path name: $logFilePath";
}