我有一个目录/ home / textfile /
我想使用perl脚本检查此目录中是否存在* .txt文件。如果他们这样做,我想让它说“文本文件存在”。其他如果目录中没有文本文件,我希望它说“不存在文本文件”。文本文件可以有任何名称我只想检查该目录/ home / textfile中是否有文本文件。
以下是我尝试使用的脚本:
$filedir="/home/textfile/";
chdir($filedir);
if (-e "`ls *.txt`")
{
print STDOUT "Text file exist"
}
else
{
print STDOUT "No Text file exist"
}
你能帮助我修复这个脚本,以便它能完成我正在寻找它的工作吗?
答案 0 :(得分:3)
最简单的方法是使用glob
获取该目录中以.txt
结尾的所有文件的列表。它避免了使用ls
喜欢这个
use strict;
use warnings;
my $dir = '/home/textfile';
my @files = glob "$dir/*.txt";
print "No " unless @files;
print "Text file exist\n";
答案 1 :(得分:0)
从perldoc
关于-X文件测试运算符:
文件测试,其中X是下面列出的字母之一。这个一元 operator接受一个参数,可以是文件名,文件句柄,也可以是 dirhandle,并测试相关文件以查看是否属实 关于它。
在用双引号括起ls
命令时,您希望测试ls
返回的文件名,但实际上您正在测试是否存在名为'ls *.txt'
的文件。
有几个选项,您可以在单独的步骤中使用ls
来获取所有文本文件名,然后测试是否存在单个文本文件名。
my @text_files = `ls *.txt`;
chomp(@text_files);
if ( -e $text_files[0] ) {
...
}
else {
...
}
但由于ls
仅 返回现有文件,因此根本不需要-e
检查。你可以简单地说:
my @text_files = `ls *.txt`;
if ( @text_files ) {
print "Text file exist"
}
else {
print "No Text file exist"
}
我也不应该这样做,因为你没有在$dir
命令中使用ls
,你实际上并没有查看$dir
目录,而是当前的工作目录。您需要将$dir
添加到ls
命令:
my @text_files = `ls $dir/*.txt`;
if ( @text_files ) {
print "Text file exist"
}
else {
print "No Text file exist"
}
或者,你可以使用glob
内置而不是shell ls
,让Perl管理如何实际读取文件。这通常是更强大和可维护的解决方案:
my @text_files = glob("$dir/*.txt");
if ( @text_files ) {
print "Text file exist"
}
else {
print "No Text file exist"
}