Bash Shell脚本如何获取目录最新修改文件并拷贝到其他目录?
Bash脚本实现方案
需求匹配的完整实现
你原有的代码存在语法错误,for循环、if判断的写法都不符合Bash语法规范。以下是符合「比对文件修改日期与当前日期,一致则拷贝」需求的可运行脚本:
#!/bin/bash # 替换为你的实际源目录、目标目录路径 SRC_DIR="/your/source/directory/path" DEST_DIR="/your/destination/directory/path" # 获取格式化后的当前日期(年月日) CUR_DATE=$(date +%Y%m%d) # 遍历源目录下所有内容 for FILE in "$SRC_DIR"/*; do # 仅处理普通文件,跳过目录、软链接等 if [ -f "$FILE" ]; then # 获取文件修改日期,格式与当前日期对齐 # macOS系统请替换为:FILE_DATE=$(date -r $(stat -f %m "$FILE") +%Y%m%d) FILE_DATE=$(date -d "@$(stat -c %Y "$FILE")" +%Y%m%d) # 日期匹配则拷贝,-p参数保留文件属性,可按需删除 [ "$FILE_DATE" = "$CUR_DATE" ] && cp -p "$FILE" "$DEST_DIR/" fi done
这个方案兼容性强,如果你需要对匹配的文件做额外操作(比如打印日志、重命名),可以在拷贝逻辑前后扩展代码。
更简便的实现方式
如果不需要额外自定义逻辑,直接用find命令一行就能完成需求,效率比循环遍历更高:
# GNU/Linux 环境使用 find /your/source/directory -maxdepth 1 -type f -daystart -mtime 0 -exec cp -p {} /your/destination/directory \;
参数说明:
-maxdepth 1仅扫描当前目录,不进入子目录,不需要可删除-type f仅匹配普通文件-daystart -mtime 0筛选当日零点后修改的所有文件-exec cp ...将匹配到的文件直接拷贝到目标目录
如果是macOS环境,使用如下命令:
# macOS 环境使用 find /your/source/directory -maxdepth 1 -type f -mtime -1d -exec cp -p {} /your/destination/directory \;
特殊场景简化:仅拷贝最新的1个当日文件
如果你的需求仅需要拷贝目录里最新的一个当日生成文件,可以用更短的逻辑实现:
#!/bin/bash SRC_DIR="/your/source/directory/path" DEST_DIR="/your/destination/directory/path" # 取目录下最新的文件 NEWEST_FILE=$(ls -Art "$SRC_DIR" | tail -n 1) FULL_PATH="$SRC_DIR/$NEWEST_FILE" # 判断为普通文件且是当日修改则拷贝 if [ -f "$FULL_PATH" ] && [ $(date -d "@$(stat -c %Y "$FULL_PATH")" +%Y%m%d) = $(date +%Y%m%d) ]; then cp -p "$FULL_PATH" "$DEST_DIR/" fi
注意事项
- 所有路径建议填写绝对路径,避免脚本执行时工作目录变动导致报错
- 变量都做了引号包裹,适配带空格、特殊字符的文件名场景
- 可以给
cp添加-n参数,避免覆盖目标目录下的同名文件
内容的提问来源于stack exchange,提问作者user12532474
相关产品推荐
相关产品推荐

