Regex 为脚本输入参数,按扩展名计算目录中的文件数

Regex 为脚本输入参数,按扩展名计算目录中的文件数,regex,perl,bash,terminal,Regex,Perl,Bash,Terminal,我想通过终端中的脚本计算由于扩展名而导致的文件数量 比如: sm1@smth:~$./scriptname.pl路径名扩展名 /home/dir/包含5个扩展名为*.extention的文件控制台中的以下命令将为您提供扩展名为EXT的dir目录中的文件数 ls DIR | grep .*\.EXT$ | wc | awk '{print $1}' 您可以适当地设置消息格式以满足您的需求 find -name "*.pdf" -exec echo -n "1" ";" | wc -c 如果文

我想通过终端中的脚本计算由于扩展名而导致的文件数量
比如:
sm1@smth:~$./scriptname.pl路径名扩展名

/home/dir/包含5个扩展名为*.extention的文件

控制台中的以下命令将为您提供扩展名为EXT的dir目录中的文件数

ls DIR | grep .*\.EXT$ | wc | awk '{print $1}'
您可以适当地设置消息格式以满足您的需求

find -name "*.pdf" -exec echo -n "1" ";" | wc -c 
如果文件名包含并非非法的“\n”,则不会失败。也可以查找访问子目录

为什么要使用perl

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
$ countFiles.pl /Users/alexreynolds/Desktop png
/Users/alexreynolds/Desktop contains 21 files of *.png

这是一个计算文件数的函数,可以选择按扩展名计算:

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

countfiles . "*.txt"

使用-print0可确保在文件名中嵌入换行符“\n”的情况下,文件计数保持正确。

以下是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";

在shell中,使用globbing和
wc
命令

ls -d /some/path/*.ext | wc -l
或者您也可以使用Perl中的
glob()

非常简单:

echo ${DIR}/*.${EXT} | wc -w
迟到了:)

用法如下所述:

$ ./countfiles.pl <dirname> <extensionminusthedot>
$。/countfiles.pl

没有值得投票的声誉。据我所知,不可能通过终端为perl脚本的路径名和扩展名设置变量?无论如何,这是可行的,谢谢。我不是perl用户,所以不知道如何用perl来做。但是,编写一个bash脚本以根据需要准确地输出消息一点也不困难。较短的等效代码:
ls DIR/*.EXT | wc-l
(不需要
grep
awk
)。如果您确实使用了
grep
,则需要转义或引用星号。谢谢。说实话,应该用C或C++来做。我更喜欢Perl,所以我对能用Perl完成它感兴趣。对不起,我的英语“不及格不及格”-哪个?在我看来,它不会失败。顺便说一下,您应该使用
printf
而不是
echo
,因为
echo
的某些版本不支持
-n
。然而+1.你是对的,这是一个打字错误。我的第一个版本在包含换行符的文件中失败,我在更新注释时出错。现在更正。这正是我需要的。但是脚本有问题:
ted@NNM:/var/www/cgi-bin$./countFiles.pl/home/ted jpg
/home/ted包含0个*.jpg文件,但仍有1个jpg文件。尝试了另一个带有png的文件夹。结果仍然相同-0@ted:这一行中的引号需要删除:
my@fileList=
(否则+1)另外,我认为
文件::Glob
是不必要的,STDOUT是默认值。@Dennis Williamson:谢谢。你说的对,我删除了引号。但是,我会在
中使用
STDOUT
语句,这使得引用更加明确。我认为
wc
不会输出任何空格,因此
sed
是不必要的。在任何情况下,AWK命令都会通过使用
$1
而不是
$0
来处理它。如果内容中包含空格,则应引用变量
ls“$DIR/”*“$EXT”
awk-v“DIR=$DIR”…
wc-l
返回空白,需要使用
sed
进行过滤。至少在我使用的
bash
版本中,引用变量会中断
ls
调用。如果文件名中有空格,则会失败。我以前从未见过关键字“command”。为什么要用它?你能详细说明一下吗?
#!/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>