pyd*_*evd 1 unix linux bash shell scripting
我有个问题.我需要编写一个bash脚本,它将在给定的路径中找到所有文件和目录,并显示一些有关结果的信息.允许时间:30秒.
#!/bin/bash
DIRS=0
FILES=0
OLD_FILES=0
LARGE_FILES=0
TMP_FILES=0
EXE_FILES=0
IMG_FILES=0
SYM_LINKS=0
TOTAL_BYTES=0
#YEAR_AGO=$(date -d "now - 1 year" +%s)
#SECONDS_IN_YEAR=31536000
function check_dir {
for entry in "$1"/*
do
if [ -d "$entry" ]; then
((DIRS+=1))
check_dir "$entry"
else if [ -f "$entry" ]; then
((FILES+=1))
#SIZE=$(stat -c%s "$entry")
#((TOTAL_BYTES+=SIZE))
#CREATE_DATE=$(date -r "$entry" +%s)
#CREATE_DATE=$(stat -c%W "$entry")
#DIFF=$((CREATE_DATE-YEAR_AGO))
#if [ $DIFF -ge $SECONDS_IN_YEAR ]; then
# ((OLD_FILES+=1))
#fi
fi
fi
done
}
if [ $# -ne 2 ]; then
echo "Usage: ./srpt path emailaddress"
exit 1
fi
if [ ! -d $1 ]; then
echo "Provided path is invalid"
exit 1
fi
check_dir $1
echo "Execution time $SECONDS"
echo "Dicrecoties $DIRS"
echo "Files $FILES"
echo "Sym links $SYM_LINKS"
echo "Old files $OLD_FILES"
echo "Large files $LARGE_FILES"
echo "Graphics files $IMG_FILES"
echo "Temporary files $TMP_FILES"
echo "Executable files $EXE_FILES"
echo "Total file size $TOTAL_BYTES"
Run Code Online (Sandbox Code Playgroud)
以下是使用上面的注释行执行的结果:
Execution time 1
Dicrecoties 931
Files 14515
Sym links 0
Old files 0
Large files 0
Graphics files 0
Temporary files 0
Executable files 0
Total file size 0
Run Code Online (Sandbox Code Playgroud)
如果我要删除评论
SIZE=$(stat -c%s "$entry")
((TOTAL_BYTES+=SIZE))
Run Code Online (Sandbox Code Playgroud)
我有:
Execution time 31
Dicrecoties 931
Files 14515
Sym links 0
Old files 0
Large files 0
Graphics files 0
Temporary files 0
Executable files 0
Total file size 447297022
Run Code Online (Sandbox Code Playgroud)
31秒 我怎样才能加速我的脚本?另外+30秒可以找到日期创建更多一年的文件
通常情况下,在shell中使用循环表明你正在采取错误的方法.
shell之前是运行其他工具的工具.
虽然它可以进行计数,但它awk是一个更好的工具.
虽然它可以列出和查找文件,但它find更好.
最好的shell脚本是那些设法有一些工具可以完成任务的脚本,而不是那些按顺序启动数百万工具并且所有工作都由shell完成的脚本.
在这里,通常更好的方法是find找到文件并收集所需的所有数据,并将其awk删除并返回统计信息.这里使用GNU find和GNU awk(for RS='\0')和GNU date(for -d):
find . -printf '%y.%s.%Ts%p\0' |
awk -v RS='\0' -F'[.]' -v yearago="$(date -d '1 year ago' +%s)" '
{
type[$1]++;
if ($1 == "f") {
total_size+=$2
if ($3 < yearago) old++
if (!index($NF, "/")) ext[tolower($NF)]++
}
}
END {
printf("%20s: %d\n", "Directories", type["d"])
printf("%20s: %d\n", "Total size", total_size)
printf("%20s: %d\n", "old", old)
printf("%20s: %d\n", "jpeg", ext["jpg"]+ext["jpeg"])
printf("%20s: %d\n", "and so on...", 0)
}'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1079 次 |
| 最近记录: |