[英]Combining greps to make script to count files in folder
我需要一些帮助,以结合脚本元素来形成读取输出。
基本上,我需要获取下面列出的文件夹结构的用户文件名,并使用* .ano文件类型为该用户计算文件夹中的行数
这显示在下面的摘录中,请注意,文件名的位置从开头算起并不总是相同。
/ home / user / Drive-backup / 2010备份/ 2010帐户/Jan/usernameneedtogrep/user.dir/4.txt
/ home / user / Drive-backup / 2011备份/ 2010帐户/Jan/usernameneedtogrep/user.dir/3.ano
/ home / user / Drive-backup / 2010备份/ 2010帐户/Jan/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
find /home -name '*.ano' | awk -F/ '{print $(NF-2)}' | sort | uniq -c
如果您的awk是正确的,那应该可以为您提供每个用户的“ * .ano”文件数。 我经常使用sort / uniq -c来计算字符串实例的数量,在这种情况下为用户名,而不是'wc -l'仅计算输入行。
请享用。
看看wc(字数) 。
从文件夹执行以下bash脚本
/home/user/Drive-backup/2010 Backup/2010 Account/Jan
并将报告每个用户的非空白行数。
#!/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
要计算目录中* .ano文件的数量,可以使用
find "$dir" -iname '*.ano' | wc -l
如果要对某个目录中的所有目录执行此操作,则可以使用for循环:
for dir in * ; do
echo "user $dir"
find "$dir" -iname '*.ano' | wc -l
done
这可能就是您想要的(未测试):关联数组需要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
这是另一种实现方法(在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.