查找命令默认排序顺序


30

linux find命令返回的条目的默认排序顺序是什么?

例如,如果我发出

find . -type f -name '*mp3' 

并且输出由跨多个子文件夹的多个文件组成,列出目录的默认顺序是什么?同时,列出单个目录中文件的排序顺序是什么?

有时它返回:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

查看如何首先列出目录B的内容,然后列出目录A的内容。同时,在目录A中,文件以有趣的顺序列出。


从经验来看,每次安装似乎一致。如果两台计算机上有相同的文件集,它将始终在一台计算机上返回一个订单,而在另一台计算机上则返回完全不同的订单。我想知道为什么以前+1
James L

1
我的车上装有FM发射器,它总是以奇怪的顺序播放闪存卡中的歌曲。我从来没有想通,但我认出那正是在上述命令返回的输出相同的顺序
Nasko

BTW:BSD find具有-s按字母顺序对输出进行排序的参数。
lapo 2015年

Answers:


19

find将遍历目录树中的订单项存储在目录条目中。(在大多数情况下)这在同一台计算机上每次运行都将保持一致,并且如果没有删除,则基本上是“文件/目录创建顺序”。

但是,某些文件系统将在压缩操作的一部分或需要扩展条目大小的情况下对目录条目进行重新排序,因此“原始”顺序随时间变化的可能性很小。如果需要一致的顺序,请通过额外的排序阶段来提供输出。


感谢您的详细回答!因此,如果我的FM发射器(请参阅我的上一条注释)以find命令列出它们的顺序播放音轨,那么我将无法控制我希望它们以什么顺序播放。
纳斯科(Nasko)2010年

好吧,闪存卡可能使用的是FAT文件系统,如果我没记错的话,使用文件系统调试器可以很容易地控制FAT条目的顺序。可能值得将歌曲从当前闪存复制到新的闪存上,并按照您想要播放的顺序,这可能会更容易。
Vatine 2010年

这种一致性的有用应用之一是对进度进行缓慢估计,然后find /path/ -exec ...以更快的速度运行find /path/以首先获取文件的排序列表。
安德烈


2

我分别从1984/1991开始从事UNIX / Linux的工作,并且找到了我所教的第一个命令。Linux / GNU已经将您需要的几乎所有内容都放入了当前的find命令中,因此请试用一下。

以下是一些有用的提示,用于对查找输出进行排序。-printf选项为您提供了许多选项,以启用更复杂的排序和文件信息显示。这是解决此类问题的最佳方法。试一试,看看有什么适合您的。使用-printf可以按所需方式自定义和定界结果。当您需要对结果进行后期处理时,这很有帮助。我希望这可以帮助别人。

  1. 如果使用-ls并想按文件名排序,则第11个字段是文件名,因此您可以执行以下操作。sort -k选项也可以采用多个字段进行排序。

    查找/ path -ls | 排序-k11

  2. 如果要进行更好的谷物控制,即按日期/时间升序或降序排序,请使用-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.