Linux find 命令返回的条目的默认排序顺序是什么?
例如,如果我发出
find . -type f -name '*mp3'
并且输出由多个子文件夹中的多个文件组成,目录列出的默认顺序是什么?同时,单个目录中的文件列出的排序顺序是什么?
有时它会返回:
./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3
看一下如何首先列出目录 B 的内容,然后列出目录 A 的内容。同时,在目录 A 中,文件按照有趣的顺序列出。
答案1
find
将按照项目在目录条目中的存储顺序遍历目录树。在同一台机器上,每次运行的顺序(大部分)都是一致的,如果没有删除,则本质上是“文件/目录创建顺序”。
但是,某些文件系统会在压缩操作或需要扩展条目大小时重新排序目录条目,因此“原始”顺序随时间的推移总会有小概率发生变化。如果您想要一致的顺序,请将输出送入额外的排序阶段。
答案2
您不应该依赖特定的输出顺序find
,而应该使用sort
其他方法来专门控制顺序。
答案3
我分别从 1984 年和 1991 年开始从事 UNIX/Linux 工作,我学到的第一个命令就是 find。Linux/GNU 已将您需要的几乎所有功能都放入当前的 find 命令中,因此请尝试使用它。
以下是对查找输出进行排序的一些有用提示。-printf 选项为您提供了许多选项,以启用更复杂的排序和文件信息显示。对于此类问题,它是最好的选择。试用一下,看看哪种方法适合您。使用 -printf,您可以按照自己想要的方式自定义和分隔结果。当您需要对结果进行后期处理时,这会很有帮助。我希望这对某些人有所帮助。
如果您使用 -ls 并希望按文件名排序,则第 11 个字段是文件名,因此您可以执行以下操作。sort -k 选项也可以采用多个字段进行排序。
查找/路径-ls|sort-k11
如果您想要更精细的控制,即按日期/时间升序或降序排序,请使用 -printf "" 选项。有关更多详细信息,请参阅手册,但以下示例将打印秒的小数部分,因此非常准确。
日期/时间示例:2016-09-17+12:09:57.9013929800
find /path -printf "%T+ %p\n" | sort -n # Ascending
find /path -printf "%T+ %p\n" | sort -nr # Descending
另一种不使用日期/时间字符串中的字符的方法是。
日期/时间示例:20160917120013.8101685040
find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n