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>