获取perl中类似命名文件的路径,其中只有扩展名不同?

时间:2016-04-07 19:42:25

标签: perl glob

我正在尝试编写Automator服务,因此我可以将其放入gui中的右键菜单中。

我有一个txt文件的文件路径,并且有一个类似命名的文件,仅在文件扩展名中有所不同。这可以是pdf或jpg,或者可能是任何其他扩展,无法事先知道。如何将文件路径获取到另一个文件(只有一个这样的文件)?

$other_name =~ s/txt$/!(txt)/;
$other_name =~ s/ /?/g;
my @test = glob "$other_name";

在Bash中,我只是打开extglob选项,并将末尾的“txt”更改为“!(txt)”和do glob扩展。但我甚至不确定它是否可用于perl。由于文件路径总是有空格(它位于一个近根目录名称中),这进一步使事情变得复杂。我已经阅读了http://perldoc.perl.org/functions/glob.html处的glob()文档,并尝试了引用的每个变体(上面的示例代码显示了我放弃后的尝试,我只是完全删除了所有空格)。

似乎我能够将模块放在脚本中,所以这不一定是裸perl(只是运行测试)。

是否有一种优雅或至少简单的方法来实现这一目标?

3 个答案:

答案 0 :(得分:3)

您可以将文件名中的所有内容解压缩到扩展名,然后使用它运行一个glob并过滤掉不需要的.txt。这是需要使用双引号来保护glob中的模式的情况之一,用于空格。

use warnings;
use strict;
use feature qw(say);

my $file = "dir with space/file with spaces.txt";

# Pull the full name without extension
my ($basefname) = $file =~ m/(.*)\.txt$/;

# Get all files with that name and filter out unneeded (txt)
my @other_exts = grep { not /\.txt$/ } glob(qq{"$basefname.*"});

say for @other_exts;

有这样的玩具结构

dir space/
file with spaces.pdf
file with spaces.txt

输出

dir space/file with spaces.pdf

recent post在相关的全球范围内有更多内容。

答案 1 :(得分:2)

Perl不允许在glob中使用 not substring 构造。您必须找到具有相同名称和任何扩展名的所有文件,并删除以.txt

结尾的文件

这个程序显示了这个想法。它将原始文件名拆分为词干部分和后缀部分,并使用词干形成圆形图案。 grep会删除以原始后缀

结尾的所有结果

如果有多个候选者,它只选择第一个匹配的文件名。如果找不到匹配的文件,$other_name将设置为undef

原始文件名应作为命令行上的参数

结果打印到STDOUT;我不知道您的右键菜单需要什么

如果您正在使用包含空格的文件路径,则必须使用行use File::Glob ':bsd_glob',因为您似乎

use strict;
use warnings 'all';

use File::Glob ':bsd_glob';

my ($stem, $suffix) = shift =~ /(.*)(\..*)/;

my ($other_name) = grep ! /$suffix$/i, glob "$stem.*";
$other_name =~ tr/ /?/;

print $other_name, "\n";

答案 2 :(得分:-1)

这是一个基于File::Basename核心模块

的示例
use File::Basename;

my $fullname = "/path/to/my/filename.txt";
my ($name, $path, $suffix) = fileparse($fullname, qw/.txt/);
my $new_filename = $path . $name . ".pdf";

# $name         --> filename
# $path         --> /path/to/my/
# $suffix       --> .txt
# $new_filename --> /path/to/my/filename.pdf