我正在尝试查找已使用某些权限修改的前 5 个最新目录。
我的查找命令是这样的
find -d -perm -a+rwx
我正在尝试将它与
ls -lt
获取 find 的结果并将它们放入一个长列表中,最近修改的文件位于顶部。
我尝试过的一切都不起作用;我最终得到了总=0的信息。
答案1
zsh-ixly:
ls -ltd -- **/*(/omf777[1,5])
这对递归返回的前 5 个 ( ) 文件执行ls
(一个l
长列表,再次按修改时间排序t
,并带有-d
仅列出目录而不列出其内容的标志)[1,5]
zsh 全局模式匹配/
具有 777 权限 ( ) 的目录 ( f777
),按修改时间 ( om
) 排序。
请注意,隐藏的文件和目录将被忽略。添加D
glob 限定符以考虑它们。
答案2
使用stat
而不是ls
. IE:
find . -type d -perm -a+rwx -exec stat -c "%Y %n" '{}' ';' | sort -rn | tail -n 5
答案3
如果您安装了 Bash(或 Zsh)和 GNU 工具,您可以处理任何文件名:
while IFS= read -r -d '' -u 9
do
printf '%q\n' "${REPLY#* }"
done 9< <(
find . -type d -perm -a+rwx -printf '%T@ %p\0' |
sort --general-numeric-sort --zero-terminated |
head --lines=5 --zero-terminated)
从外向内读取,会执行以下操作:
- 查找向世界开放的目录。
- 对于每个目录,打印修改时间戳和文件路径,后跟 NUL 字符。
- 按数字方式对列表进行排序,即根据时间戳进行排序,因为这是第一列。
- 获取前五个以零结尾的条目。
- 请一一阅读此列表。
- 从每个条目中去除时间戳。
- 打印每个文件名的引用版本。
答案4
find
传统上/传统上与 配对xargs
:
find …something… -print0 | xargs -0 …dosomething…
具体到你的 qn 管道应该做xargs -0 ls -dlt
☝️注意:如果没有管道输入,BSD 1版本将无法运行;xargs
但对于 GNU 你最好使用-r
(man xargs
会透露)
__
1 — 正如评论中所指出的,OpenBSD 是一个例外(因为 OpenBSD 经常出现这种情况);)