2011-03-15 75 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

相關問題