我想通過終端中的腳本來計算由於它們的擴展引起的文件數量;
像:
SM1 @水木清華:〜$ ./scriptname.pl路徑延伸
/家庭/ DIR /包含5個文件的* .extention
腳本輸入參數,計數文件的擴展名dir
回答
這裏是用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
在控制檯下面的命令會給你的文件數在DIR目錄中用EXT擴展名。
ls DIR | grep .*\.EXT$ | wc | awk '{print $1}'
您可以適當地格式化消息以符合您的要求。
find -name "*.pdf" -exec echo -n "1" ";" | wc -c
將不會失敗,如果文件名包含'\ n'這不是非法的。查找訪問子目錄。
爲什麼要使用perl?
謝謝。說實話應該用C或C++來完成。我更喜歡Perl,所以我感興趣的可以在Perl中完成。 對不起,我的英文 – ted 2011-03-15 08:33:20
「失敗不失敗」 - 哪?在我看來,它不會失敗。順便說一句,你應該使用'printf'而不是'echo',因爲'echo'的某些版本不支持'-n'。儘管如此+1。 – 2011-03-15 09:14:40
你是對的 - 這是一個錯字。我的第一個版本因包含換行符的文件而失敗,並且我在更新評論時犯了一個錯誤。現在糾正了。 – 2011-03-15 16:00:14
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
謝謝,這很酷^ _^ – ted 2011-03-15 08:36:10
我不認爲'wc'輸出任何空格,所以'sed'是不必要的。在任何情況下,AWK命令都會使用'$ 1'而不是'$ 0'來處理它。如果內容包含空格,則應引用您的變量。 'ls「$ DIR /"*".exT」'和'awk -v「dir = $ DIR」...' – 2011-03-15 09:23:00
'wc -l'返回空白,需要用'sed'過濾。至少在我使用的'bash'版本中,引用變量會打破'ls'調用。 – 2011-03-15 13:06:53
下面是計算文件的功能,可選的擴展:
countfiles() {
command find "${1:-.}" -type f -name "${2:-*}" -print0 | command tr -dc '\0' | command wc -c
return 0
}
countfiles . "*.txt"
使用-print0確保您的文件數的情況下,保持正常有文件帶有嵌入換行符的名稱「\ n」。
+1非常聰明! – 2011-03-15 09:10:43
我從來沒有見過關鍵字'命令'。爲什麼使用?你能詳細說明嗎? – 2011-03-16 07:01:24
在殼,使用通配和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;
謝謝。這樣可行。只是不能投票 – ted 2011-03-15 11:47:17
很簡單做到在Perl:描述
echo ${DIR}/*.${EXT} | wc -w
失敗與空白文件名 – 2011-03-15 16:01:43
感謝您的意見:) – Dagang 2011-03-16 01:50:39
跳頻晚:)
#!/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>
感謝U.作品。不能投票。 – ted 2011-03-15 11:53:09
- 1. 通過文件擴展名驗證腳本的參數?
- 2. bash腳本參數擴展
- 3. 擊參數擴展和文件名
- 4. 計數文件擴展名C#
- 5. Python計數文件擴展名
- 6. 訪問擴展選擇參數腳本插件參數
- 7. 在Bash腳本中雙參數擴展
- 8. IDEA python文件列表腳本參數未擴展
- 9. 文本文件擴展名
- 10. groovy腳本迭代通過一個文件夾,並寫入所有擴展名爲擴展名的文件名,但擴展名爲.txt的文件
- 11. 重命名文件而不輸入文件擴展名
- 12. 更改dir中每個文件的擴展名,* .txt除外
- 13. HTML5文件輸入不一致的文件擴展名行爲
- 14. 如何在shell腳本中刪除文件名的擴展名?
- 15. 在批處理腳本中沒有擴展名的文件名
- 16. bash腳本重命名文件的擴展名
- 17. 如何使用xml文件作爲腳本的參數輸入
- 18. 簡單的awk腳本,不需要參數或輸入文件
- 19. SQLITE3數據庫文件的擴展名
- 20. Windows腳本宿主 - 沒有文件擴展名(文件路徑)
- 21. 如何使用MATLAB dir函數指定文件擴展名掩碼
- 22. 加入雙文件(名稱相同,但不同的擴展名)在bash腳本
- 23. 參數擴展(`!$`)
- 24. 從目錄中刪除文件擴展名dir
- 25. BASH獲取沒有GET參數的文件擴展名?
- 26. GET參數正在獲取不需要的文件擴展名
- 27. 文件擴展名的節點參數RegExp
- 28. 使用bash腳本重命名xml文件擴展名
- 29. 在可變文件名中嵌入數字和擴展名
- 30. MySQL的腳本,輸入用戶名和密碼作爲參數
這正是我需要的。但隨着劇本有問題: '特德@ NNM:在/ var/WWW/cgi-bin目錄$ ./countFiles.pl /家庭/泰德jpg' '/家庭/泰德包含的* .jpg' 0文件仍然有1個JPG文件。 用png試過了另一個文件夾。仍然是相同的結果 - 0; – ted 2011-03-15 08:50:16
@ted:引用需要在這一行中刪除:'my @fileList = <$ directory /*.$ extension>;'(否則爲+1)另外,我認爲'File :: Glob'不是必需的, STDOUT是默認值。 – 2011-03-15 09:53:58
@丹尼斯威廉姆森:謝謝。作品。 – ted 2011-03-15 11:43:03