MST
星途 面试题库

面试题:Bash字符串比较与模式匹配在复杂场景中的优化

给定一个包含大量文件名(可能包含特殊字符和空格)的目录,你需要编写一个Bash脚本,筛选出所有文件名以'backup_'开头,且文件修改时间在最近一周内的文件,并将这些文件移动到另一个目录。脚本要高效处理文件名中的特殊情况,并且考虑到性能优化。请提供详细的脚本实现及优化思路。
46.3万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/bin/bash

# 目标目录,包含大量文件名
source_dir="your_source_directory"
# 目标移动目录
target_dir="your_target_directory"

# 计算一周前的时间戳
one_week_ago=$(date -d "1 week ago" +%s)

# 使用find命令查找文件并移动
find "$source_dir" -maxdepth 1 -type f -name 'backup_*' -newermt "$(date -d @$one_week_ago +%Y-%m-%d)" -exec bash -c '
    for file do
        target_path="'$target_dir'"/"$(basename -- "$file")"
        mv -n "$file" "$target_path"
    done
' _ {} +

优化思路

  1. 使用find命令find命令在查找文件方面非常高效。通过-maxdepth 1选项,我们只在源目录的顶层查找文件,避免递归查找子目录,这在处理大量文件时可以显著提高性能。
  2. 时间比较:使用-newermt选项,结合一周前的时间戳来筛选出最近一周内修改的文件。
  3. 文件名处理:使用basenamemv -nbasename确保目标文件名正确,mv -n防止覆盖目标目录中已存在的同名文件。
  4. 减少进程启动次数:在find-exec选项中,通过bash -cfor循环一次性处理所有找到的文件,而不是为每个文件单独启动一个mv进程,这样可以减少系统开销,提高脚本执行效率。