gpt4 book ai didi

shell - 为什么 find 在传递当前目录与路径时返回不同的排序结果?

转载 作者:行者123 更新时间:2023-12-04 15:16:00 25 4
gpt4 key购买 nike

我正在尝试编写一个返回最近修改的文件的 shell 命令。但是,目录中的文件多于 ls 可以直接容纳的文件(因此使用 find,我认为这是通过管道传输到其他命令的正确解决方案)。

这样做时,我遇到了在目录中运行 find . 和传递目录以查找( find $folder )。

这是一个例子:

➜  echo $SHELL
/usr/local/bin/zsh
➜ pwd
/Users/aresnick/Downloads
➜ find . -type f -maxdepth 1 -print0 | xargs -0 ls -t | head -1
./DID_Codebook_2020.pdf
➜ find $(pwd) -type f -maxdepth 1 -print0 | xargs -0 ls -t | head -1
/Users/aresnick/Downloads/Profiles17_MA.pdf
➜ find /Users/aresnick/Downloads -type f -maxdepth 1 -print0 | xargs -0 ls -t | head -1
/Users/aresnick/Downloads/Profiles17_MA.pdf

请注意,DID_Codebook_2020.pdfProfiles17_MA.pdf 不是同一个文件。 我如何解释为什么这些命令似乎返回不同的结果?

作为引用,这里是 ls -halt | 的输出head -5 在目录中(包括最近混淆的两个文件)。

➜ ls -halt | head -5
total 51229416
drwxr-xr-x+ 92 aresnick staff 2.9K Oct 12 10:34 ..
drwx------@ 4033 aresnick staff 126K Oct 12 10:02 .
-rw-r--r--@ 1 aresnick staff 1.7M Oct 12 10:02 DID_Codebook_2020.pdf
-rw-r--r--@ 1 aresnick staff 470K Oct 12 10:00 Profiles17_MA.pdf

通过 stat 更仔细地观察,change 时间似乎在 Profiles17_MA.pdf 上实际上更新了>:

➜  stat -f "ACCESS-%Sa   CHANGE-%Sc %SN" {DID_Codebook_2020.pdf,Profiles17_MA.pdf}
ACCESS-Oct 12 10:02:14 2020 CHANGE-Oct 12 10:02:08 2020 DID_Codebook_2020.pdf
ACCESS-Oct 12 10:02:14 2020 CHANGE-Oct 12 10:02:10 2020 Profiles17_MA.pdf

但是,我不明白这如何解释为什么排序顺序会随 find .find ~/Downloads 发生变化。

是什么原因?我有一种模糊的直觉,这可能与我们正在查看 inode 的更改时间这一事实有关,以及与包含目录更改有关的一些事情……一些事情。

提前致谢!请注意,虽然我也对我的特定排序问题的解决方案感兴趣,但我最感兴趣的是了解为什么会出现差异。

最佳答案

xargs 的工作是拆分超过系统可容纳的命令行。为了便于说明,我们假设您有四个文件和一个操作系统,其中 ARG_MAX 仅为 25 字节(尽管在现实生活中,现代系统的大小约为兆字节)。然后在没有路径的情况下,xargs 运行

ls -t ./a ./b ./c ./d

但是对于完整路径,命令行必须分成两个调用,以免超过命令行长度的限制:

ls -t /path/to/a /path/to/b
ls -t /path/to/c /path/to/d

当然,如果 d 是您的最新文件,head 仍将返回第一个 ls 调用的最新文件。

在带有 GNU find(Linux 等)的系统上,使用其 -printf 选项格式化一个字符串,其中修改时间在文件名之前。

find . -type f -printf "%T+\t%p\0" |
sort -rnz |
perl -n000 's/^[^\t]+\t//; print; exit'

我们按修改时间排序,然后丢弃修改时间并只打印文件名。空定界符负责处理其中包含换行符的文件名;此功能尤其是 GNU 扩展。

如果您没有 GNU 实用程序,您可以使用具有类似格式字符串的 find -exec stat;不幸的是,stat 的这个特性也不是标准化的,但应该不难找到非 Linux 系统(如 BSD、macOS 等)的示例。

关于shell - 为什么 find 在传递当前目录与路径时返回不同的排序结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64320196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com