2011-03-15 102 views

回答

2

这里是用Perl的等效:

#!/usr/bin/perl 

# countFiles.pl  

use strict; 
use warnings; 
use File::Glob qw(:glob); 

my $directory = $ARGV[0]; 
my $extension = $ARGV[1]; 
my @fileList = <$directory/*.$extension>; 
my $fileListCount = scalar @fileList; 

print STDOUT "$directory contains $fileListCount files of *.$extension\n"; 

实例:

$ countFiles.pl /Users/alexreynolds/Desktop png 
/Users/alexreynolds/Desktop contains 21 files of *.png 
+0

这正是我需要的。但随着剧本有问题: '特德@ NNM:在/ var/WWW/cgi-bin目录$ ./countFiles.pl /家庭/泰德jpg' '/家庭/泰德包含的* .jpg' 0文件仍然有1个JPG文件。 用png试过了另一个文件夹。仍然是相同的结果 - 0; – ted 2011-03-15 08:50:16

+1

@ted:引用需要在这一行中删除:'my @fileList = <$ directory /*.$ extension>;'(否则为+1)另外,我认为'File :: Glob'不是必需的, STDOUT是默认值。 – 2011-03-15 09:53:58

+0

@丹尼斯威廉姆森:谢谢。作品。 – ted 2011-03-15 11:43:03

0

在控制台下面的命令会给你的文件数在DIR目录中用EXT扩展名。

ls DIR | grep .*\.EXT$ | wc | awk '{print $1}' 

您可以适当地格式化消息以符合您的要求。

+0

没有投票的声望。据我所知,不可能通过终端设置perl脚本的路径名和扩展名的变量? 无论如何,这个作品,谢谢。 – ted 2011-03-15 08:25:06

+0

我不是一个Perl用户,所以不能告诉如何在Perl中做到这一点。但是写一个bash脚本来根据需要吐出确切的消息并不难。 – jitendra 2011-03-15 08:29:04

+0

等价较短:'ls DIR/*。EXT | wc -l'(不需要'grep'或'awk')。如果你使用'grep',星号需要被转义或引用。 – 2011-03-15 09:08:16

2
find -name "*.pdf" -exec echo -n "1" ";" | wc -c 

将不会失败,如果文件名包含'\ n'这不是非法的。查找访问子目录。

为什么要使用perl?

+0

谢谢。说实话应该用C或C++来完成。我更喜欢Perl,所以我感兴趣的可以在Perl中完成。 对不起,我的英文 – ted 2011-03-15 08:33:20

+0

“失败不失败” - 哪?在我看来,它不会失败。顺便说一句,你应该使用'printf'而不是'echo',因为'echo'的某些版本不支持'-n'。尽管如此+1。 – 2011-03-15 09:14:40

+0

你是对的 - 这是一个错字。我的第一个版本因包含换行符的文件而失败,并且我在更新评论时犯了一个错误。现在纠正了。 – 2011-03-15 16:00:14

0
ls ${DIR}/*.${EXT} \ 
    | wc -l \ 
    | sed -e 's/^[ \t]*//' \ 
    | awk -v dir=$DIR -v ext=$EXT '{print dir" contains "$0" files of *."ext}' 

用法示例:

$ DIR=/Users/alexreynolds/Desktop 
$ EXT=png 
$ ls ${DIR}/*.${EXT} | wc -l | sed -e 's/^[ \t]*//' | awk -v dir=$DIR -v ext=$EXT '{print dir" contains "$0" files of *."ext}' 
/Users/alexreynolds/Desktop contains 21 files of *.png 
+0

谢谢,这很酷^ _^ – ted 2011-03-15 08:36:10

+0

我不认为'wc'输出任何空格,所以'sed'是不必要的。在任何情况下,AWK命令都会使用'$ 1'而不是'$ 0'来处理它。如果内容包含空格,则应引用您的变量。 'ls“$ DIR /"*".exT”'和'awk -v“dir = $ DIR”...' – 2011-03-15 09:23:00

+0

'wc -l'返回空白,需要用'sed'过滤。至少在我使用的'bash'版本中,引用变量会打破'ls'调用。 – 2011-03-15 13:06:53

1

下面是计算文件的功能,可选的扩展:

countfiles() { 
    command find "${1:-.}" -type f -name "${2:-*}" -print0 | command tr -dc '\0' | command wc -c 
    return 0 
} 

countfiles . "*.txt" 

使用-print0确保您的文件数的情况下,保持正常有文件带有嵌入换行符的名称“\ n”。

+0

+1非常聪明! – 2011-03-15 09:10:43

+0

我从来没有见过关键字'命令'。为什么使用?你能详细说明吗? – 2011-03-16 07:01:24

1

在壳,使用通配和wc命令。

ls -d /some/path/*.ext | wc -l 

或者你可以用​​3210

#!/usr/bin/env perl 

use strict; 
use warnings; 

my($path, $ext) = @ARGV; 
my @files = glob "$path/*$ext"; 
printf "Found %d files in %s with extension %s\n", scalar @files, $path, $ext; 
+0

谢谢。这样可行。只是不能投票 – ted 2011-03-15 11:47:17

0

很简单做到在Perl:描述

echo ${DIR}/*.${EXT} | wc -w 
+0

失败与空白文件名 – 2011-03-15 16:01:43

+0

感谢您的意见:) – Dagang 2011-03-16 01:50:39

1

跳频晚:)

#!/usr/bin/perl 

use warnings; 
use strict; 

scalar @ARGV == 2 or die "Need two args"; 

opendir(my $dh, $ARGV[0]); 
my @files = grep { /\.$ARGV[1]/ } readdir($dh); 
closedir($dh); 

printf "Directory '%s' contains %d files with extension '.%s'\n", $ARGV[0], scalar @files, $ARGV[1]; 

用法:

$ ./countfiles.pl <dirname> <extensionminusthedot> 
+0

感谢U.作品。不能投票。 – ted 2011-03-15 11:53:09

相关问题