2016-07-08 85 views
3

我想創建一個腳本,獲取擴展和報告在兩列,用戶和用戶擁有該擴展的文件數量。 結果必須打印在report.txt中與剪切和grep報告

這是我的代碼。

#!/bin/bash 

#Uncoment to create /tmp/test/ with 50 txt files 
#mkdir /tmp/test/ 
#touch /tmp/test/arch{01..50}.txt 

clear 

usage(){ 
    echo "The script needs an extension to search" 
    echo "$0 <extension>" 
} 

if [ $# -eq 0 ]; then 
    usage 
    exit 1 
fi 

folder="/tmp/test/" 
touch report.txt 
count=0 
pushd $folder 

for file in $(ls -l); do 
    grep "*.$1" | cut -d " " -f3 >> report.txt 
done 

popd 

該程序運行不休。而且我甚至沒有爲每個用戶計算文件。 我怎樣才能解決這個只使用grep和切?

+0

你能給輸入和預期的輸出? – Fazlin

+3

'grep「*。$ 1」| ......'greps ins stdin。你的程序永遠在等待着。我沒有文件參數或缺少輸入管道。 –

+0

你可以用'find $ folder -name'*。$ 1「-printf」%P \ t%u \ n「>> report.txt'來代替for循環,然後用一些wc。 –

回答

2

隨着GNU stat

stat -c '%U' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt 

正如mklement0指出,在BSD/OSX則必須使用-f選項與stat

stat -f '%Su' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt 

編輯:

要處理許多文件並避免參數數量限制,您最好使用printf管道輸送到stat命令(再次感謝mklement0):

printf '%s\0' *."$1" | xargs -0 stat -c '%U' | sort | uniq -c | awk '{print $2,"\t",$1}' 
+1

很好地完成了;來補充你的GNU'stat'語法與BSD/OSX'stat'的語法:'-c'%U''必須替換爲'-f'%Su''。 – mklement0

+1

很好的答案。就一件事。根據glob將顯示的文件數量,「stat」的參數列表可能會變得太長。基於「find」的解決方案將更加穩定。 – hek2mgl

+1

@ hek2mgl:這是一個值得關注的問題,但是您可以用'printf'%s \ 0'*。「$ 1」來修復這個問題。 xargs -0 stat ...'(因爲'printf'是一個Bash _builtin_,它不受最大命令行長度限制的限制)。 – mklement0

0

你並不需要爲這個循環(除非您以後需要循環幾個文件夾),並改變工作目錄的腳本是很少必要。另外,通常不建議閱讀ls輸出。

這裏有一個版本,它取代了環,並使用du

ext="$1" 

printf "Folder '%s':\t" "$folder" >>report.txt 

du -hc "$folder"/*."$ext" | sed -n '$p' >>report.txt 
+1

我認爲OP需要文件的_count_,而不是合併的存儲大小。此外,您錯過了用戶名稱分組。 – mklement0

+0

@ mklement0我將「文件數量」解釋爲「文件的組合大小」。這並不完全清楚。我還假設稍後'$ folder'將用於識別用戶名(主目錄)。 – Kusalananda