尝试将 find 命令与 ls -lt 结合起来

尝试将 find 命令与 ls -lt 结合起来

我正在尝试查找已使用某些权限修改的前 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) 排序。

请注意,隐藏的文件和目录将被忽略。添加Dglob 限定符以考虑它们。

答案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)

从外向内读取,会执行以下操作:

  1. 查找向世界开放的目录。
  2. 对于每个目录,打印修改时间戳和文件路径,后跟 NUL 字符。
  3. 按数字方式对列表进行排序,即根据时间戳进行排序,因为这是第一列。
  4. 获取前五个以零结尾的条目。
  5. 请一一阅读此列表。
  6. 从每个条目中去除时间戳。
  7. 打印每个文件名的引用版本。

答案4

find传统上/传统上与 配对xargs

find …something… -print0 | xargs -0 …dosomething…

具体到你的 qn 管道应该做xargs -0 ls -dlt

☝️注意:如果没有管道输入,BSD 1版本将无法运行;xargs但对于 GNU 你最好使用-rman xargs会透露)

__

1 — 正如评论中所指出的,OpenBSD 是一个例外(因为 OpenBSD 经常出现这种情况);)

相关内容