【问题标题】:Bash script to find specific files older than 90 days and put them in .csv file用于查找超过 90 天的特定文件并将它们放入 .csv 文件的 Bash 脚本
【发布时间】:2022-10-24 14:11:37
【问题描述】:

我有下面的 bash 脚本,我正在尝试找到一种方法来编写附加功能,该功能还计算文件的最后修改和当前日期之间的天数:

#!/bin/bash

read -p "do you want to find the files? Y/N " -n 1 -r
echo

echo "path , $(date +%d-%m-%Y)" >> checked_files.csv
find . -name "data.csv" | xargs -d '\n' stat -c "%-25n;%y" | echo "$(date +%d-%m-%Y) - $(stat 
-c "%-25n;%y")" | bc >> checked_files.csv
find . -name "output_for_CPA_tool.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "info_table.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "int_2.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "intermediate.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "output_for_MME_tool.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "media_contacts.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "modeldata.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv
find . -name "modeldata.RData.csv" | xargs -d '\n' stat -c "%-25n;%y" >> checked_files.csv

【问题讨论】:

  • 仅使用一个 csv 更新您的问题。你有错误吗?期望值应该如何表现?
  • 谢谢@JRichardsz

标签: bash file directory find


【解决方案1】:

您可以使用 :

datediff() {
    d1=$(date -d "$1" +%s)
    d2=$(date -d "$2" +%s)
    echo $(( (d1 - d2) / 86400 )) days
}

在您的情况下,您可以计算如下所示的天数(通过在脚本中添加上述行):

datediff "$(date +%F)" "`find . -name "modeldata.csv" | xargs -d '
' stat -c "%-25n;%y" | cut -d";" -f2 | awk '{print $1}' | head -n 1`"

所以为了完整的方式,你可以编写你的命令:

#!/bin/bash

datediff() {
    d1=$(date -d "$1" +%s)
    d2=$(date -d "$2" +%s)
    echo $(( (d1 - d2) / 86400 )) days
}

result1=`find . -name "modeldata.csv" | xargs -d '
' stat -c "%-25n;%y" | awk '{print $1}'`
datediff1=$(datediff "$(date +%F)" "`find . -name "modeldata.csv" | xargs -d '
' stat -c "%-25n;%y" | cut -d";" -f2 | awk '{print $1}' | head -n 1`")
echo "$result1 $datediff1" >> checked_files.csv 

【讨论】:

    【解决方案2】:

    建议单个 find 命令,由 awk 脚本过滤。

     find . -regextype egrep -regex "(data|output_for_CPA_tool|info_table|int_2|intermediate|output_for_MME_tool|media_contacts|modeldata|modeldata.RData).csv" -printf "%p %CY-%Cj $(date +%Y-%j)
    " | awk -F "[ -]" '{print $1, (($4*365)+$5)-(($2*365)+$3)}' >> checked_files.csv
    

    但是,如果您只想要超过 90 天的文件,而不需要计算天数。

    -ctime +90 将过滤所有更改时间大于 90 天的文件。

    这样find 命令就变成了:

      find . -regextype egrep -regex "(data|output_for_CPA_tool|info_table|int_2|intermediate|output_for_MME_tool|media_contacts|modeldata|modeldata.RData).csv" -ctime +90 >> checked_files.csv
    

    第 1 阶段,构建所需文件的列表,其中包含上次更改日期和当前日期

    建议使用单个find 命令:

    find . -regextype egrep -regex "(data|output_for_CPA_tool|info_table|int_2|intermediate|output_for_MME_tool|media_contacts|modeldata|modeldata.RData).csv" -printf "%p %CY-%Cj $(date +%Y-%j)
    "
    

    所有文件的预期响应列表

    建议的选择列表:

    <files_relative_path> <year_last_change>-<day_num_in_year> <curr_year>-<curr_day_in_year>
    ./dir1/modeldata.csv 2022-013 2022-069
    ./dir2/info_table.csv 2022-013 2022-069
    ./dir3/modeldata.csv 2022-013 2022-069
    ./dir3/data.csv 2022-013 2022-069
    ./dir1/output_for_MME_tool.csv 2022-013 2022-069
    

    第 2 阶段,计算日差并打印出来

    awk -F "[ -]" '{print $1, (($4*365)+$5)-(($2*365)+$3)}'
    

    所有文件的预期响应列表

    建议选择列表:

    <files_relative_path> <days_since_last_change>
    ./dir1/modeldata.csv 0
    ./dir2/info_table.csv 12
    ./dir3/modeldata.csv 21
    ./dir3/data.csv 376
    ./dir1/output_for_MME_tool.csv 231
    

    第 3 阶段,将输出重定向到 &gt;&gt; checked_files.csv

    详细解释

    find 命令详情

    . 从当前目录开始往下看。

    -regextype egrep 设置正则表达式解释器为egrep

    -regex "(data|output_for_CPA_tool|info_table|int_2|intermediate|output_for_MME_tool|media_contacts|modeldata|modeldata.RData).csv" 匹配所有必需文件名的正则表达式名称过滤器。

    -printf "%p %CY-%Cj $(date +%Y-%j) " 每个文件的输出:%p 文件的相对路径,%CY 上次更改的年份,%Cj 上次更改的年份,$(date +%Y-%j) 格式的当前日期YYYY-jjjjjj 代表当前一年中的一天。

    awk 命令详情

    -F "[ -]" awk 的字段分隔符设置为 -。所以会有5个字段。

    {print $1, (($4*365)+$5)-(($2*365)+$3)} 输出 $1 即文件的相对路径。比计算天数差。 $4 是当前年份,$5 是当前年份,$2 最后更改年份,$3 最后更改年份日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2016-02-12
      • 2013-12-12
      • 1970-01-01
      • 2012-01-06
      相关资源
      最近更新 更多