我的文件结构为:
FOLDER/SUB_FOLDER/Text_File
我有超过 1k+ 个FOLDER
,每个FOLDER
都有至少 2 个不同的,SUB_FOLDER
每个都有SUB_FOLDER
自己的Text_File
。
我正在尝试挑战自己,列出一份最最近的 Text_File
每FOLDER/
(作为根)
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
\0
ETC。
不能\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];
}
}'