我有一个关于Linux和shell 脚本的问题,我知道它不能从创建日期获取文件,只能从修改日期获取文件,但是如果我在文件名上获得创建日期呢?

例如,现在有一个文件夹,其中包含一些文件:

ABCADD01-20230801
ABCADD01-20230802
ABCADD01-20230803
ABCADD01-20230804
ABCADD02-20230801
ABCADD02-20230802
ABCAEE01-20230801
ABCAEE01-20230802
ABCAEE01-20230803
ABCAFF01-20230801
ABCAGG01-20230802

我需要找到文件名是"ABCADD"和创建日期是"2天前或更早",并压缩这些文件.今天是20230804

我有个主意是用两个for循环: 第一个循环查找包含"ABCADD"的文件名,第二个循环查找创建日期为两天前的文件.

# Get the date for two days ago
two_days_ago=$(date -d "2 days ago" +%Y%m%d)

# Find the "ABCADD" files that were last modified two days ago, zip them
for file in $(find . -name 'ABCADD*' -type f ); do
    for file in $(find . -name '*$two_days_ago' -type f ); do
    echo "Zipping $file"
    gzip "$file"
    done
done

预期的最终结果应该是

ABCADD01-20230801
ABCADD01-20230802 
ABCADD02-20230801
ABCADD02-20230802

但是,我不能得到"两天前或更早",只能得到具体的一天,这是20230802,仍然有一些错误.有更好的办法吗?

推荐答案

UPDATE

这里有一个可能的解决方案,形式是date; find -exec awk | xargs gzip:

two_days_ago=$(date -d '2 days ago' +%Y%m%d)

find . -name 'ABCADD*-20[0-9][0-9][0-9][0-9][0-9][0-9]' \
       -exec awk -v max="$two_days_ago" '
           BEGIN {
               for ( i = 1; i < ARGC; i++ ) {
                   n = split(ARGV[i], a, "-");
                   if ( a[n] <= max)
                       printf("%s%c", ARGV[i], 0);
               }
               exit;
           }
       ' {} + |
xargs -0 gzip

Linux相关问答推荐

与mmap和munmap相比,保留一个巨大内存文件(约400 MB)的mmap多次的性能成本

如何更正我的CMakeLists.txt,使我的项目同时构建在Linux和Windows上?

如何调试tokio任务挂起的位置?

在 bash 脚本中保持两个进程处于活动状态(并在死亡时重生它们)

sed:用空格替换

中的换行符

什么命令用于在linux中创建或修改具有指定文件大小的多个文件

如何使用 Bash 将随机数据块写入文件

仅显示 tcsh 或 bash 中作为符号链接的文件和文件夹

Linux 非阻塞 fifo(按需日志(log)记录)

从 shell 将多个 .sql 转储文件导入 mysql 数据库

我如何从 Ubuntu 上的源代码自己构建 python?

有没有办法在整个项目代码中的某个日期之后找出更改的文件?

让 sudo 和 nohup 一起工作

Ant 找不到 javac,在 Ubuntu 上不会设置 JAVA_HOME

使用 Bash 查找和复制文件

用curl编译php,curl安装在哪里?

Linux如何确定下一个PID?

将默认 Python 版本从 2.4 更改为 2.6

如何自动启动 Solr?

为嵌入式 Linux 设备实施更新/升级系统