我正在尝试找到一种方法来查找多个目录的最后 n 个最新文件。
问题在于目录是结构化的,但并不是真正分层放置的,但它们有特定的名称。例子:
./sensor
-./motion
--./2dMotion
---./saved
----./<name>.csv
---./processed
----./<name>.csv
--./3dMotion
---./saved
---./processed
-./temp
--./saved
---./<name>.csv
--./processed
我的问题如下:我可以在 find 命令中使用 -regex 选项,但这在执行进一步的搜索过滤最新文件的命令后只能给我最新的文件,但这仅对最新文件有效,无论传感器如何用来。
我想要实现的是创建输出,其中根据时间戳显示最新的 n 个文件。
我怎样才能尽可能简单地做到这一点?
答案1
对于GNU 系统上.csv
任意目录中的10 个最新常规文件:saved
LC_ALL=C find . -type f -regex '.*/saved/[^/]*\.csv' -printf '%T@:%p\0' |
sort -rnz |
awk -v RS='\0' -F/ '{sub(/[^:]*:/, ""); file = $0; NF--}
++n[$0] <= 10 {print file}'
(文件将从最新到最旧的顺序列出)。
使用zsh
,您还可以执行以下操作:
for dir (**/saved(NDF)) print -rC1 -- $dir/*.csv(ND.om[1,10])
答案2
find . -type d -exec bash -c 'echo "next dir: ${1}" ; ls -lt "$1" |
grep ^- |
head -n 5' bash {} \;
整棵树中最新的
事实证明这不是答案,因为它提供了整个树中的最新文件,但无论如何它可能有帮助。
find . -type f -printf "%T@ %p\n" |
sort -nr |
awk 'NR==6 { exit; } {$1=""; print; }'
答案3
ls -lt |grep '^-' |head -n N
只需在循环内使用。
for DIR in /path/to/*; do
if [ -d "$DIR"]; then
ls -lt "$DIR/*.csv" |grep '^-' |head -n N
fi
done
其中 N 是最新文件的数量,您可以指定每个目录的结果中显示的文件数量。看曼LS。