bash脚本,以帮助识别文件和路径,计数按星期几排序

bash脚本,以帮助识别文件和路径,计数按星期几排序,bash,unix,Bash,Unix,我还不是一个真正的编剧,所以提前道歉 我需要做的是搜索过去7天内的文件路径,然后计算每个目录中每天(周一到周日)每个目录中的文件数 所以对于每个人来说 从文件夹-根文件 目录1: 星期一的文件数 文件数..n 星期天的文件数 目录2: 星期一的文件数 文件数..n 星期天的文件数 到目前为止,我已经从我的基本命令行知识和一些研究中了解到了这一点 #!/bin/bash find . -type f -mtime -7 -exec ls -l {} \; | grep "^-" | awk '{

我还不是一个真正的编剧,所以提前道歉

我需要做的是搜索过去7天内的文件路径,然后计算每个目录中每天(周一到周日)每个目录中的文件数

所以对于每个人来说

从文件夹-根文件

目录1: 星期一的文件数 文件数..n 星期天的文件数 目录2: 星期一的文件数 文件数..n 星期天的文件数

到目前为止,我已经从我的基本命令行知识和一些研究中了解到了这一点

#!/bin/bash

find . -type f -mtime -7 -exec ls -l {} \; | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
        printf "%s\t%d\n", date, freq[date]
}'
但是有几个问题,我需要打印每个目录,然后我需要计算星期一、星期二、星期三的排序

出于某种原因,它可以在我的测试文件夹中使用基本文件夹和名称,但不能在生产文件夹中使用

即使是一些关于从哪里开始思考的建议也会有所帮助

提前谢谢大家,你们都很棒


尼尔

我发现了一些有帮助的附加代码

 #!bin/bash

# pass in the directory to search on the command line, use $PWD if not arg received
rdir=${1:-$(pwd)}

# if $rdir is a file, get it's directory
if [ -f $rdir ]; then
    rdir=$(dirname $rdir)
fi

# first, find our tree of directories
for dir in $( find $rdir -type d -print ); do
    # get a count of directories within $dir.
    sdirs=$( find $dir -maxdepth 1 -type d | wc -l );
    # only proceed if sdirs is less than 2 ( 1 = self ).
    if (( $sdirs < 2 )); then 
        # get a count of all the files in $dir, but not in subdirs of $dir)
        files=$( find $dir -maxdepth 1 -type f | wc -l ); 
        echo "$dir : $files"; 
    fi
done
使用我的原始代码块,这会有所帮助

道具

对于这段代码,这是一个很好的问题

我认为在
find
命令中,您需要添加
--time style=+%w
以获取一周中的某一天

find . -type f -mtime -7 -exec ls -l --time-style=+%w {} \;
我不知道为什么要对以破折号开头的行进行灰显(因为您已经只找到了文件)。这不是必需的,所以我将删除它

然后,我将通过剥离文件名或每行最后一个斜杠后的所有内容,从该输出中获取目录名

| sed -e 's:/[^/]*$:/:'
然后我会在一周的前一天把所有的代币都剪下来。由于您使用
作为起点,因此可以预期每个目录都以
/
开头

| sed -e 's:.*\([0-6]\) \./:\1 ./:'
从这里可以
sort-k2
按目录名排序,然后按星期几排序

find . -type f -mtime -7 -exec ls -l --time-style=+%w {} \;
最终,您可以通过管道将其传输到
uniq-c
中,以按目录获取每周的天数,但我会首先将其转换为人类可读的天数

| awk '
  /^0/ { $1 = "Monday   " }
  /^1/ { $1 = "Tuesday  " }
  /^2/ { $1 = "Wednesday" }
  /^3/ { $1 = "Thursday " }
  /^4/ { $1 = "Friday   " }
  /^5/ { $1 = "Saturday " }
  /^6/ { $1 = "Sunday   " }
  { print $0 }
'
综上所述:

find . -type f -mtime -7 -exec ls -l --time-style=+%w {} \; \
  | sed -e 's:/[^/]*$:/:' \
  | sed -e 's:.*\([0-6]\) \./:\1 ./:' \
  | sort -k2 \
  | awk '
  /^0/ { $1 = "Monday   " }
  /^1/ { $1 = "Tuesday  " }
  /^2/ { $1 = "Wednesday" }
  /^3/ { $1 = "Thursday " }
  /^4/ { $1 = "Friday   " }
  /^5/ { $1 = "Saturday " }
  /^6/ { $1 = "Sunday   " }
  { print $0 }
' | uniq -c
在我的完全随机
PWD上
看起来是这样的:

  1 Monday    ./
  1 Tuesday   ./
  5 Saturday  ./
  2 Sunday    ./
 17 Monday    ./M3Javadoc/
  1 Thursday  ./M3Javadoc/
  1 Saturday  ./M3Javadoc/
  1 Sunday    ./M3Javadoc/

你必须使用shell吗?对于任何非琐碎的事情,我都会选择perl或python之类的语言。我会选择@NoufalIbrahim作为第二语言。虽然我觉得用Ruby更容易;)是的,现在我需要使用bash:(事实上,我被告知perl很好,所以我可能会继续使用perl,因为我在perl中更容易使用,谢谢大家!