列出每个子文件夹的最新文件

列出每个子文件夹的最新文件

我的文件结构为:

FOLDER/SUB_FOLDER/Text_File

我有超过 1k+ 个FOLDER,每个FOLDER都有至少 2 个不同的,SUB_FOLDER每个都有SUB_FOLDER自己的Text_File

我正在尝试挑战自己,列出一份最最近的 Text_FileFOLDER/(作为根)

My Pseudo code is (as well as commands I know right now): 
List all FOLDERS
 - **ls -t [EACH_FOLDER] | head -n1 **
    **ls -t EACH_FOLDER/SUB_FOLDER/**
      **ls Text_File**

输出应该是:

/FOLDER/SUB_FOLDER/Text_File

...

全部文件。

我的目标是:我需要对每个根目录中的每个最新 Text_File 进行 grep 解析,FOLDER以从中解析信息。

答案1

#!/bin/bash

# Array of root folders
folders=("a" "b")

# Search all specified root folders
for f in ${folders[@]}; do
    # Descend hierarchy and retrieve modification date of each file with "stat"
    find $f -type f -exec stat -f "%m,%N" {} ';' | \
        # sort by date, most recent first
        sort -gr | \
        # extract first (most recent) file
        head -1 | \
        # return file name only
        cut -d, -f2
done

答案2

gnu可以尝试:

find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
  /^d/ {directoryname=substr($0,2)}
  /^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
    lmtimes[directoryname]=$1;
    lmtimedns[directoryname]=substr($0,index($0," ")+1);
  }
  END {for (directoryname in lmtimedns) print lmtimedns[directoryname]}
  '

该版本已经针对包含特殊字符的奇怪名称进行了测试:\n "等。

$(pwd)执行pwd命令,打印当前目录的绝对路径名。

find $(pwd)搜索当前目录,将打印完整目录路径名

过滤器-mindepth 2 -maxdepth 2 -type d仅选择第二级别的目录,其中FOLDER当前目录的级别为 1,其SUB_FOLDER级别为 2。

-printf "d%h\0%T@ %p\0"打印每个SUBFOLDER找到的信息,如下:

d FOLDER \0 last modif time in second since EPOCH [space] SUBFOLDER \0ETC。

不能\0是名称的一部分,因此这是完美的分隔符。

awk -v RS="\0"正在考虑\0作为记录分隔符。

/^d/ {directoryname=substr($0,2)}regex当记录以d;开头时,这是正确的。directoryname变量通过构造更新FOLDER为由字符后面的所有字符组成的名称d,这要归功于printf.

/^[0-9]/regex当记录以数字开头时,这是正确的。通过构造,由于printf,当前记录的第一个字段($1例如,直到 ̀ [space]char 的所有字符)包含最后修改时间。

&& (!lmtimes[directoryname] || lmtimes[directoryname] < $1)时代是一个关联数组([键,值]对的映射)。用于存储SUBFOLDER当前FOLDER( directoryname)当前最新的最后修改时间。表达式是true如果尚未存储最后修改时间,directoryname或者如果已存储的最后修改时间早于当前时间SUBFOLDER

当后面的表达式为 true 时,最后修改时间和名称都FOLDER使用 key 存储directoryname时代实时域名系统, 分别。

END {for (...:当所有记录都被解析后,SUBFOLDER打印每个具有最新最后修改时间的名称。

----

对于历史记录,命令列出每个目录的最近修改时间的文件名:

 find "$(pwd)" -depth -type f -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
  /^d/ {
    directoryname=substr($0,2);
  }
  /^[0-9]/ {
    if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
      lmtimes[directoryname]=$1;
      lmtimefns[directoryname]=substr($0,index($0," ")+1);
    }
  }
  END {
    for (directoryname in lmtimefns) {
      print lmtimefns[directoryname];
    }
  }'

相关内容