我们在使用HDFS Shell的时候只用最频繁的命令可能就是 ls
了,其具体含义我就不介绍了。在使用 ls
的命令时,我们可能想对展示出来的文件按照修改时间排序,也就是最近修改的文件(most recent)显示在最前面。如果你使用的是Hadoop 2.8.0以下版本,内置是不支持按照时间等属性排序的。不过值得高兴的是,我们可以结合Shell命令来实现按照文件最近修改的时间对 ls
命令输出结果进行排序;比如,我想按照最近修改的时间升序排序(也就是越早修改的文件显示在最上面),可以如下实现:
[iteblog@www.iteblog.com ~]$ hadoop fs - ls /user/iteblog | sort -k6,7
drwxr-xr-x - iteblog iteblog 0 2015-06-16 14:57 /user/iteblog/hive
drwxr-xr-x - iteblog iteblog 0 2016-07-04 16:16 /user/iteblog/spark
drwxr-xr-x - iteblog iteblog 0 2016-11-16 20:07 /user/iteblog/data
drwxr-xr-x - iteblog iteblog 0 2016-12-12 18:59 /user/iteblog/logs
drwxr-xr-x - iteblog iteblog 0 2017-02-17 02:40 /user/iteblog/temp
drwxr-xr-x - iteblog iteblog 0 2017-02-18 19:22 /user/iteblog/ .sparkStaging
drwx------ - iteblog iteblog 0 2017-02-18 20:11 /user/iteblog/ .Trash
|
如果你想按照最近修改的时间降序排序(也就是越早修改的文件显示在最下面),可以如下实现:
[iteblog@www.iteblog.com ~]$ hadoop fs - ls /user/iteblog | sort -r -k6,7
drwx------ - iteblog iteblog 0 2017-02-18 20:11 /user/iteblog/ .Trash
drwxr-xr-x - iteblog iteblog 0 2017-02-18 19:22 /user/iteblog/ .sparkStaging
drwxr-xr-x - iteblog iteblog 0 2017-02-17 02:40 /user/iteblog/temp
drwxr-xr-x - iteblog iteblog 0 2016-12-12 18:59 /user/iteblog/logs
drwxr-xr-x - iteblog iteblog 0 2016-11-16 20:07 /user/iteblog/data
drwxr-xr-x - iteblog iteblog 0 2016-07-04 16:16 /user/iteblog/spark
drwxr-xr-x - iteblog iteblog 0 2015-06-16 14:57 /user/iteblog/hive
|
如果你使用的是Hadoop 2.8.0及以上版本,我们可以发现Hadoop内置(HADOOP-8934)就支持了这个功能,如下:
Usage: hadoop fs - ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] <args>
Options:
-C: Display the paths of files and directories only.
-d: Directories are listed as plain files.
-h: Format file sizes in a human-readable fashion (eg 64.0m instead of 67108864).
-q: Print ? instead of non-printable characters.
-R: Recursively list subdirectories encountered.
-t: Sort output by modification time (most recent first).
-S: Sort output by file size.
-r: Reverse the sort order.
-u: Use access time rather than modification time for display and sorting.
|
可以从上面 ls
参数列表看出,最新版的Hadoop ls
命令支持了更多的功能,不仅仅是文件按照修改时间排序(包括升序和降序),还可以按照文件大小排序等。所以我们可以直接在命令行上使用这个功能:
[iteblog@www.iteblog.com ~]$ hadoop fs - ls -t /user/iteblog
drwx------ - iteblog iteblog 0 2017-02-18 20:11 /user/iteblog/ .Trash
drwxr-xr-x - iteblog iteblog 0 2017-02-18 19:22 /user/iteblog/ .sparkStaging
drwxr-xr-x - iteblog iteblog 0 2017-02-17 02:40 /user/iteblog/temp
drwxr-xr-x - iteblog iteblog 0 2016-12-12 18:59 /user/iteblog/logs
drwxr-xr-x - iteblog iteblog 0 2016-11-16 20:07 /user/iteblog/data
drwxr-xr-x - iteblog iteblog 0 2016-07-04 16:16 /user/iteblog/spark
drwxr-xr-x - iteblog iteblog 0 2015-06-16 14:57 /user/iteblog/hive
|
hadoop fs -ls -t -r /user/iteblog
输出的结果正好和上面相反。
有些用户可能会说,你不是说这个功能是从Hadoop 2.8.0版本开始才支持的,但是为什么我在Hadoop 2.7.1的官方文档看到了有关 ls
支持 -t
参数的说明呢?如下:
Usage: hadoop fs - ls [-d] [-h] [-R] [-t] [-S] [-r] [-u] <args>
Options:
-d: Directories are listed as plain files.
-h: Format file sizes in a human-readable fashion (eg 64.0m instead of 67108864).
-R: Recursively list subdirectories encountered.
-t: Sort output by modification time (most recent first).
-S: Sort output by file size.
-r: Reverse the sort order.
-u: Use access time rather than modification time for display and sorting.
|
我想和你说,这是一个误会,其实这个版本并不支持。不信你自己去命令行试试。