Windows 更新根文件夹的修改时间

news2024/11/15 12:41:05

简介:
Win10 系统不会根据深层目录文件更新主目录的修改时间.
一般解决办法是关闭 Winodws 搜索引擎。

win10文件夹不能自动更新了怎么办?_百度知道

本脚本通过递归遍历子目录和子文件,来更新根目录的时间。
使用内层目录和当前目录下的最新文件的修改时间,更新根目录的修改时间。

#! /bin/bash
# 版本:
# bash  --version: GNU bash,版本 4.4.12(3)-release-(x86_64-unknown-cygwin)
# ls    --version: ls (GNU coreutils) 9.0
# touch --version: touch (GNU coreutils) 9.0
#
# 作者:
# blog.csdn.net/tiandyoin 2022.10.18
#
# 简介:
# Win10 系统不会根据深层目录文件更新主目录的修改时间.
# 一般解决办法是关闭 Winodws 搜索索引。
# https://zhidao.baidu.com/question/1970249248433264740.html
# 本脚本通过递归遍历子文件,来更新根目录的时间。
# 使用内层目录和当前目录下的最新文件的修改时间,更新主目录的修改时间。
# Usage:
# [./]update_dir_time[.sh] -h
# [./]update_dir_time[.sh] [-q]  .
# [./]update_dir_time[.sh] [-qs] ./
# [./]update_dir_time[.sh] [-sv] ../
# [./]update_dir_time[.sh] [-st] .\\
# [./]update_dir_time[.sh] [-stv] /usr/bin/
# [./]update_dir_time[.sh] [-stv] "/usr/bin/tiandyoin text dir - 副本"
# [./]update_dir_time[.sh] [-stv] C:\\Cygwin64\\bin\\tiandyoin text dir - 副本\\
# [./]update_dir_time[.sh] [-stv] "C:\Cygwin64\bin\tiandyoin text dir - 副本"
# [./]update_dir_time[.sh] [-stv] "C:\Cygwin64\bin\tiandyoin text dir - 副本\\"
#
# -h 查看帮助
# -q 安静模式,不输出任何消息。
# -s 安全模式,当父目录时间比子目录或子文件晚时,不更新父目录时间。
# -t 统计各函数的执行时间
# -v 输出详细的文件遍历信息
#
# 备注:
# 不比较时间,如果子级文件的修改时间 与 当前父级目录的修改时间相同,仍会覆盖父级修改时间。
# 更改文件名,不会改变文件的修改时间,但会改变当前父级目录的修改时间。
# update_dir:   会把当前父级目录的修改时间 回退为 更名文件的修改时间。
# update_dir_s: 如果当前父级目录的修改时间 大等于 内层内容的修改时间,则保持父级修改时间。
#
# FAQ:
# 1.总用时      35s(27个文件,20个目录)
#   正常处理    18s(包括touch)
#   打印处理    17s
#   touch       5s
# 2.为什么使用"Break 2"无效? ---
# 3.很多地方要判断文件或目录是否合法?
#   Hacker 可能创建空字符(空格、制表符、换页符等)文件或目录,会造成程序死循环。
# 4.以下两种方式都无法阻止 touch 失败时强制退出
#   command || true
#   if a command exits with a non-zero status, ignore that and continue.
# 5.$IFS Shell预置变量
#   字符串分隔符,识别字符串或单词边界,默认值是空格,脚本中根据需要可以修改此变量的值。
#
set +e

function update_dir_main()
{
  # 获取参数
  get_opt $*
  
  # 转换路径
  case "`uname`" in CYGWIN*)
    MAIN_DIR=`cygpath -U "$MAIN_DIR"`;;
  esac

  [[ $MODE_QUIET == 0 ]] && echo -e "________________________________________________________________________________"
  [[ $MODE_QUIET == 0 ]] && echo -e "FUNC=$FUNC \nMAIN_DIR=\"$MAIN_DIR\" \nDealing..."
  [[ $MODE_VERBOSE == 1 ]] && printf "\n[ T K C ]: TraveL, Keep, Change.\n\n"

  start_time 'update_dir_main()'
  
  # 调用主体
  update_dir $MAIN_DIR
  
  end_time 'update_dir_main()'

  [[ $MODE_VERBOSE == 1 ]] && printf "\n[ T K C ]: TraveL, Keep, Change.\n\n"
  
  # 打印非法路径
  print_invalid_list
  
  # 统计 目录 和 文件 总个数
  print_total_files $MAIN_DIR

  # 打印各流程总时间
  print_time_spans

  [[ $MODE_QUIET == 0 ]] && echo -e "\nDone!"

  return 0
}

function update_dir()
{
  LEVEL=`expr $LEVEL + 1`
  
  start_time 'Folder Expand'

  local dir="$*"
  [[ $MODE_VERBOSE == 1 ]] && printf "[ T     ]: " && print_info "$dir" || true

  # 务必把目录排在最前面,递归优先处理叶子层目录。
  # 每个路径一行,按时间倒序,最新的最前。
  # read 命令在读取数据时会把 \t 替换成空格,以及行末尾的 \t 舍弃,其它无法识别的字符也丢弃。
  #
  # ls -1tA --indicator-style=none --group-directories-first "$dir" | \
  #   while read fd
  local OLDIFS="$IFS"
  IFS=$'\n'
    for fd in `ls -1taA --indicator-style=none --group-directories-first "$dir"`
    do
      invalid "$dir" "$fd"; [[ $? -ne 0 ]] && continue
      if [ -d "$dir/$fd" ]
      then
        update_dir "$dir/$fd" || true
      fi
    done
  IFS="$OLDIFS"

  end_time 'Folder Expand'
  start_time 'Folder Collapse'

  # 按间倒序,重新排序当前目录,用目录下内容的最新修改时间更新当前目录。
  # update_dir   => ls -1tA
  # update_dir_s => ls -1ta     (会出现 ".", ".." 目录)
  #
  # ls -1tA --indicator-style=none "$dir" | \
  #   while read fd
  local OLDIFS="$IFS"
  IFS=$'\n'
    for fd in `ls $LS_OPTION --indicator-style=none "$dir"`
    do
      invalid "$dir" "$fd"; [[ $? -ne 0 ]] && continue

      if [[ "$fd" == "." || "$fd" == ".." ]]      # 当前目录或上级目录最新,不用修改
      then
        [[ $MODE_VERBOSE == 1 ]] && printf "[   K   ]: " && print_info "$dir/$fd" || true
      else
        start_time 'touch()'

        touch -mr "$dir/$fd" "$dir" || true

        end_time 'touch()'

        [[ $MODE_VERBOSE == 1 ]] && printf "[     C ]: " && print_info "$dir/$fd" || true
      fi

      break
    done
  IFS="$OLDIFS"

  end_time 'Folder Collapse'
  
  LEVEL=`expr $LEVEL - 1`

  return 0
}

function get_opt()
{
  MODE_QUIET=0
  MODE_STAT_TIME=0
  MODE_VERBOSE=0
  MAIN_DIR=

  LEVEL=0
  FUNC=update_dir
  LS_OPTION="-1tA"
  __SPACE_REPLACER__='?'        # 用 '?' 替换 空字符,以便存入 TIME_SPAN_LIST
  declare -Ag INVALID_LIST      # -g 全局变量。-a 顺序数组;-A 关联数组,类似 C++ Map.
  declare -Ag TIME_SPAN_LIST
  declare -Ag TIME_START_LIST
  declare -Ag TIME_END_LIST

  while getopts ":hqstv" opt; do
    case ${opt} in
      h )
        echo "Usage:"
        echo "  update_dir_time [options] [dir]"
        echo ""
        echo "General Options:"
        echo "  -h    show help."
        echo "  -q    suppress all normal output."
        echo "  -s    safe mode, reserve parent directory's update-time when it's latest."
        echo "  -t    statistics time of some modules."
        echo "  -v    verbosely list files processed."
        exit 0
      ;;
      q )
        MODE_QUIET=1
        MODE_VERBOSE=0
        MODE_STAT_TIME=0
      ;;
      s )
        FUNC=update_dir_s
        LS_OPTION="-1ta"
      ;;
      t )
        MODE_STAT_TIME=1
        MODE_QUIET=0
      ;;
      v )
        MODE_VERBOSE=1
        MODE_QUIET=0
      ;;
      \? )
        echo "Invalid Option: -$OPTARG" 1>&2
        exit 1
      ;;
      : )
        echo "Miss Option Argument: -$OPTARG requires an argument" 1>&2
        exit 2
      ;;
    esac
  done

  shift $((OPTIND -1))  # remove options
  
  MAIN_DIR="$*"
  [[ -z "$MAIN_DIR" || ! ( -e "$MAIN_DIR" ) ]] && echo -e "Path not found!\nType 'update_dir_time -h' for help." && exit 1

  return 0
}

function invalid()
{
  local dir="$1"
  local file="$2"
  if [[ -z "$file" || ! ( -e "$dir/$file" ) ]]
  then
    if [[ ! -z "$file" && "$file" != "." && "$file" != ".." ]]
    then
      # collect invalid list
      echo "LINENO=$LINENO invalid $dir/$file"
      local level_time_dir=`get_time_path "$dir/$file"` || true

      local level_time_dir_ind=echo "$level_time_dir" | tr "[:space:]" "$__SPACE_REPLACER__"

      INVALID_LIST["$level_time_dir_ind"]="$level_time_dir"
    fi
    return 1
  fi

  return 0
}

function get_time_path()
{
    local fd="$*"
    [[ -e "$fd" ]] && fd=$(realpath -es "$fd")
    [[ -d "$fd" ]] && fd="$fd/"

    local time_path=`ls -ldQ --indicator-style=none --time-style="+///%Y-%m-%d %H:%M:%S///" "$fd" | awk -F"///" '{print $2,$3}'` || true

    local level_time_dir=$(printf "%s %3d: %s\n" Level $LEVEL "$time_path")

    echo "$level_time_dir"
}

function print_info()
{
  if [ $MODE_VERBOSE == 1 ]
  then
    local level_time_dir=`get_time_path "$*"`

    printf "$level_time_dir\n"
  fi
  return 0
}

function print_total_files()
{
  if [ $MODE_QUIET == 0 ]
  then
   local dir="$*"
   # 递归统计指定目录下的文件数(包括子层)
   local total_dirs=`ls -AlR "$dir" | grep "^-" | wc -l`
   
   # 递归统计指定目录下的目录(文件夹)数(包括子层)
   local total_files=`ls -AlR "$dir" | grep "^d" | wc -l`
   
   printf "\nDealed Totals : %5d\n       DIRs   : %5d\n       Files  : %5d\n" \
   $(($total_dirs + $total_files)) $total_dirs $total_files
  fi
  return 0
}

function print_invalid_list()
{
  if [ $MODE_VERBOSE == 1 ]
  then
    echo -e "\nInvalid paths as follow:"
    echo "${INVALID_LIST[@]}"
  fi
  return 0
}

function start_time()
{
  if [ $MODE_STAT_TIME == 1 ]
  then
    local key=`echo -e "$@"`
    key=`echo -e "$key"|tr "[:space:]" "$__SPACE_REPLACER__"`
      # echo "start_time key=\"$key\""
    # TIME_START_LIST[$key]=$(date +%s)
    TIME_START_LIST[$key]=$[$(date +%s%N)/1000000]
  fi
  return 0
}

function end_time()
{
  if [ $MODE_STAT_TIME == 1 ]
  then
    local key=`echo -e "$@"`
    key=`echo -e "$key"|tr "[:space:]" "$__SPACE_REPLACER__"`
      # echo "  end_time key=\"$key\""
    # TIME_END_LIST[$key]=$(date +%s)
    TIME_END_LIST[$key]=$[$(date +%s%N)/1000000]
    local time_span=$[ ${TIME_END_LIST[$key]} - ${TIME_START_LIST[$key]} ]
    TIME_SPAN_LIST[$key]=$(( ${TIME_SPAN_LIST[$key]} + $time_span ))
  fi
  return 0
}

function print_time_spans()
{
  if [ $MODE_STAT_TIME == 1 ]
  then
    local key=`echo -e "update_dir_main()"|tr "[:space:]" "$__SPACE_REPLACER__"`
    printf "\nTime Span %-18s: %6.1f sec\n" "Totals" `awk 'BEGIN{printf "%.2f\n",'${TIME_SPAN_LIST["$key"]}'/'1000.0'}'`
    for key in ${!TIME_SPAN_LIST[*]}
    do
      local org_key=`echo -e "$key" | tr "$__SPACE_REPLACER__" " "`
      printf "          %-18s: %6.1f sec\n" "$org_key" `awk 'BEGIN{printf "%.2f\n",'${TIME_SPAN_LIST["$key"]}'/'1000.0'}'`
    done
  fi
  return 0
}

# 全局主函数调用
update_dir_main $*

测试图例:

Windows 安装 Cygwin 或 Linux Shell 里输入:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1800670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(杂交版)植物大战僵尸

1.为什么我老是闪退? 答:主页控制台把“后台运行”点开,尽量避免全屏就会好很多。 2.哪里下载? 答:夸克https://pan.quark.cn/s/973efb326f81 3.为啥我没有14个卡槽? 答:冒险没打,怪…

课时149:项目发布_基础知识_项目交付

1.1.1 项目交付 学习目标 这一节,我们从 基础知识、代码发布、小结 三个方面来学习 基础知识 简介 项目交付是一个涉及到多团队共同协作的事情,它包括 产品团队设计产品、研发团队开发产品、测试团队测试代码、运维团队发布代码和维护站点等工作。项…

运维 之 DNS域名解析

前言 我们每天打开的网站,他是如何来解析,并且我们怎么能得到网站的内容反馈的界面呢?那什么是DNS呢(DNS(DomainNameservice,域名服务,主要用于因特网上作为域名和IP地址相互映射)那…

【Python】读取文件夹中所有excel文件拼接成一个excel表格 的方法

我们平常会遇到下载了一些Excel文件放在一个文件夹下,而这些Excel文件的格式都一样,这时候需要批量这些文件合并成一个excel 文件里。 在Python中,我们可以使用pandas库来读取文件夹中的所有Excel文件,并将它们拼接成一个Excel表…

【UE5 刺客信条动态地面复刻】实现无界地面01:动态生成

2024.6.4更新 昨天半夜意识到生成Cube的方案不合适,又开始到处找动态地面的方法,发现了我想要的效果直接可以用nigara实现!!!! 于是这个部分就暂时告一段落,今季开始新的方向的学习。 为了快速…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要:本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文分享终篇状态报错与启停慢篇,主要分为以下四个部分: 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

1.vue2.x-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址:source-code: 源码笔记 1.下载nodejs v16.x 下载地址:Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

如何删除电脑端口映射?

在使用电脑进行网络连接时,有时需要进行端口映射以实现不同设备之间的信息远程通信。当这些端口映射不再需要时,我们需要及时删除它们以确保网络的安全和稳定。本文将介绍如何删除电脑端口映射的方法。 操作系统自带的工具 大多数操作系统都提供了自带…

【docker】centos7配置docker镜像阿里云加速

国内从 DockerHub 拉取镜像有时会遇到困难,由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务。 测试了几次阿里云的加速是最快的。 …

OpenCV学习(4.6) 图像梯度

1.目标 在本教程中: 你会学到如何找到图像的梯度,边缘等。你会学到如下函数:**cv.Sobel(),cv.Scharr(),cv.Laplacian()** 等。 图像梯度是图像处理中的一个基本概念,它用于测量图像亮度变化的强度和方向…

springCloud中将redis共用到common模块

一、 springCloud作为公共模块搭建框架 springCloud 微服务模块中将redis作为公共模块进行的搭建结构图&#xff0c;如下&#xff1a; 二、redis 公共模块的搭建框架 如上架构&#xff0c;代码如下pom.xml 关键代码&#xff1a; <dependencies><!-- SpringBoot Boo…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(中)【入门篇】

文章目录 前言四、信息头管理器五、Jmeter参数化 5.1 用户自定义的变量 5.2 csv批量添加 5.3 用户参数 5.4 随机数函数 5.5 计数器函数 5.6 时间函数六、Jmeter断言 6.0 断言介绍 6.1 响应断言 6.2 大小断言 6.3 持续时间断…

AI炒股:用Kimi获取美股的历史成交价格并画出股价走势图

在Kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 用akshare库获取谷歌(股票代码&#xff1a;105.GOOG)、亚马逊(股票代码&#xff1a;105.AMZN )、苹果(股票代码&#xff1a;105.AAP…

内存经验分享

目录 内存统计工具 /proc/meminfo Buddy ​​​​​​​​​​​​​​Slub ​​​​​​​Procrank /proc/pid/smaps ​​​​​​​Dumpsys meminfo 内存评估 内存泄漏 Lmk 水位调整 内存统计工具 /proc/meminfo 可以提供整体内存信息&#xff0c;各字段表示的意思如…

【论文速读】| BIOCODER:一个具有上下文实用知识的生物信息学代码生成基准测试

本次分享论文&#xff1a;BIOCODER: A Benchmark for Bioinformatics Code Generation with Contextual Pragmatic Knowledge 基本信息 原文作者&#xff1a;Xiangru Tang, Bill Qian, Rick Gao, Jiakang Chen, Xinyun Chen, Mark Gerstein 作者单位&#xff1a;耶鲁大学, Go…

Vitis HLS 学习笔记--MAXI位宽拓展

目录 1. 简介 2. 用法解析 2.1 命令语法 2.2 实例展示 3. 注意事项 4. 总结 1. 简介 在 Vitis 工具流程中&#xff0c;Vitis HLS 能够自动将 m_axi 接口端口的大小调整为 512 位&#xff0c;以改善突发访问能力。但是&#xff0c;端口宽度自动调整仅支持标准 C 语言数据…

2024年自然语言处理科学与信息检索技术国际会议(ICNLPSIRT 2024)

2024年自然语言处理科学与信息检索技术国际会议(ICNLPSIRT 2024) 2024 International Conference on Natural Language Processing Science and Information Retrieval Technology (ICNLPSIRT 2024) 会议地点&#xff1a;武汉&#xff0c;中国 网址&#xff1a;http://www.i…

短剧看剧系统投流版系统搭建,前端uni-app

目录 前言&#xff1a; 一、短剧看剧系统常规款短剧系统和投流版的区别&#xff1f; 二、后端体系 1.管理端&#xff1a; 2.代理投流端 三、功能区别 总结&#xff1a; 前言&#xff1a; 23年上半年共上新微短剧481部&#xff0c;相较于2022年全年上新的454部&#xff0…

RE_Python

python的exe文件解包 要确保使用工具的环境是和Python version一样&#xff08;我这里是需要3.11&#xff09; 不然&#xff0c;ezpy.exe_extracted文件夹点进去&#xff0c;类似PYZ-00.pyz_extracted的文件夹会是空的&#xff01;&#xff01; pyc反编译问题 ImportError:…

AIGC+营销:AI在营销领域的演变与营销人员的新角色

一、AI在营销领域的演变 随着AI技术的不断发展&#xff0c;营销领域也迎来了新的变革。从目前的“AI Copilot”阶段&#xff0c;到未来的“AI Agent”和“AI自主营销团队”阶段&#xff0c;AI的角色将逐渐从辅助人类到独立承担更多职责。 AI Copilot&#xff08;副驾驶&#…