2011-06-17 86 views
0

我需要一些幫助組合腳本的元素來組成一個讀取輸出。結合greps使腳本來計算文件夾中的文件

基本上我需要獲得下面列出的文件夾結構的用戶的文件名,並使用計算行的文件夾中的數與該文件類型* .ano

這在示出該用戶請從下面的提取中注意,文件名中的位置並不總是與前面的位置相同。

/家庭/用戶/驅動器的備份/ 2010備份/ 2010帳號/月/ usernameneedtogrep/user.dir來/ 4.txt

/家庭/用戶/驅動器的備份/ 2011備份/ 2010帳號/月/usernameneedtogrep/user.dir/3.ano

/家庭/用戶/驅動器的備份/ 2010備份/ 2010帳號/月/ usernameneedtogrep/user.dir來/ 4.ano

awk -F/ '{print $(NF-2)}' 

這會給我是我需要的用戶名,但我也需要知道它們在文件類型* .ano的用戶文件夾中有多少非空行。我在下面的grep工程,但我不知道如何把它放在一起,所以它可以輸出一個合理的文件。

grep -cv '^[[:space:]]*$' *.ano | awk -F: '{ s+=$2 } END { print s }' 

實施例輸出需要

UserA 500 
UserB 2 
UserC 20 
+0

有些答案是,即使他們工作得嚇人。 `ar =(「$ {@%/ *}」)printf「%s \ 000」「$ {ar [@]%/ *}」看起來像是絕對的亂碼,這就是說,十年。如果這是您將要使用的一段時間,請在選擇解決方案時考慮自己的情況並考慮可維護性。 – 2011-06-19 06:19:20

回答

0

看一看wc (word count)

+0

@overbose謝謝,不知道關於wc,但仍然需要結合所有的元素來獲得一個outtputted的文本文件 – Grimlockz 2011-06-17 09:59:21

0

從文件夾

/home/user/Drive-backup/2010 Backup/2010 Account/Jan 

執行下面的bash腳本,它會報告每用戶非空行數。

#!/bin/bash 

#save where we start 
base=$(pwd) 
# get all top-level dirs, skip '.' 
D=$(find . \(-type d ! -name . -prune \)) 

for d in $D; do 
    cd $base 
    cd $d 
    # search for all files named *.ano and count blank lines 
    sum=$(find . -type f -name *.ano -exec grep -cv '^[[:space:]]*$' {} \; | awk '{sum+=$0}END{print sum}') 
    echo $d $sum 
done 
0

要計算如果你想這樣做,在某些目錄中的所有目錄,你可以只使用一個for循環,您可以使用

find "$dir" -iname '*.ano' | wc -l 

的目錄中的* .ano文件數:

for dir in * ; do 
    echo "user $dir" 
    find "$dir" -iname '*.ano' | wc -l 
done 
0

這可能是你想要的(未經測試):需要bash的第4版。關聯數組

declare -A count 
cd /home/user/Drive-backup 
for userdir in */*/*/*; do 
    username=${userdir##*/} 
    lines=$(grep -cv '^[[:space:]]$' $userdir/user.dir/*.ano | awk '{sum += $2} END {print sum}') 
    ((count[$username] += lines)) 
done 

for user in "${!count[@]}"; do 
    echo $user ${count[$user]} 
done 
1
find /home -name '*.ano' | awk -F/ '{print $(NF-2)}' | sort | uniq -c 

如果你的awk是正確的,那麼應該給你每個用戶的「* .ano」文件的數量。我經常使用sort/uniq -c來計算一個字符串的實例數,在這種情況下是username,而不是'wc -l'只計算輸入行。

享受。

0

這裏還沒有這樣做的另一種方式(在Mac OS X 10.6):

find -x "$PWD" -type f -iname "*.ano" -exec bash -c ' 
    ar=("${@%/*}")     # perform a "dirname" command on every array item 
    printf "%s\000" "${ar[@]%/*}" # do a second "dirname" and add a null byte to every array item 
' arg0 '{}' + | sort -uz | 
while IFS="" read -r -d '' userDir; do 
    # to-do: customize output to get example output needed 
    echo "$userDir" 
    basename "$userDir" 
    find -x "${userDir}" -type f -iname "*.ano" -print0 | 
    xargs -0 -n 500 grep -hcv '^[[:space:]]*$' | awk '{ s+=$0 } END { print s }' 
    #xargs -0 -n 500 grep -cv '^[[:space:]]*$' | awk -F: '{ s+=$NF } END { print s }' 
    printf '%s\n' '----------' 
done 
相關問題