find与ls命令合体坑总结

作为一个高级系统工程师,当然要熟悉linux下各种命令的快速拼写。O(∩_∩)O哈哈~
然而,find与ls命令的快捷方式我们又知道多少了?
我们可能会用find / -name xxx -type f,可能会用ls -lrt,我们知道ls中-k代表按kg显示,-s代表按块显示,-h文件大小更和谐的方式显示。但很少有时间去发现有那么内置能提高工作效率提高自己段位的参数。我们就举几个好用的例子来抛砖引玉。

  1. 首先我们需要知道linux中文件的时间有以下三种:

    mtime:文件最后内容修改时间。
    ctime:文件最后属性改变时间,也可以叫status。可以使用-c代替。
    atime:文件最后被读取时间,也可以叫accessuse。可使用-u代替。

    我们通常使用ls -l或ll的结果中的时间为mtime,即文件内容改变的时间。我们可以通过--time=atime选项来改变显示时间为文件最后读取时间,查看属性改变时间也同理。更快速的方法是使用-c-u选项。

  2. 为了让显示的时间更好看点,我们需要调整时间的格式:

    ls -l --time-style='+%Y-%m-%d %H:%M:%S' -u

    切记 --time-style要和 -l 选项一起使用。格式可以修改,比如'+%Y-%m-%d' 只显示日期。更简单的方法是:ls -l --full-time

  3. 查看时间时我们一般都需要排序,可能通过–sort选项实现:

    ls -l --time-style='+%Y-%m-%d %H:%M:%S' -u --sort=time

    --sort=time是指使用当前指定的时间(没有指定就使用默认mtime)来倒排。使用ls -lt也可以达到排序的目的,但这种是按mtime排序,也是倒排。需要正排就使用-r来实现,如:ls -lrt
    --sort不仅可以按时间排序,还可以按文件大小倒排-S(大写)。如果--sort不够用,我们可以选择sort命令,比如:

    [root@myos ~]# ls -lh --time-style='+%Y-%m-%d' | sort -k3
    total 4.9M
    -rw-rw-r--. 1 postgres postgres 1.5K 2017-11-08 data2.csv
    -rw-r--r--. 1 postgres postgres  398 2017-08-24 id_rsa.pub
    -rw-rw-r--. 1 postgres postgres 4.9M 2017-11-08 data1.csv
    drwxr-xr-x. 2 postgres postgres    6 2017-08-24 Desktop
    -rw-rw-r--. 1 postgres postgres   82 2017-11-23 test.sql

    sort一般按tab作为列分隔符,当然也可以加-t $'\t'来指定分割符

  4. 接下来我们需要说说find了,终于到正题了。
    我们如果需要查找几天之前或者之后,或者某一天的,ls是不能实现的,所以就有了find命令:

    命令解释数学解释
    find . -type f -mtime +5当前目录下5天以前的文件((n+1)*24h, -∞)
    find . -type f -mtime 5当前目录下前5天的文件[n*24h,(n+1)*24h]
    find . -type f -mtime -5当前目录下5天以内的文件(0, n*24h)

    这里我们需要注意加-type f,不然很容易踩到坑,下面我们会解释。

  5. 但查出来的文件我们看不到文件的日期,所以我们需要借助ls来实现:

    find . -type f -mtime +5| xargs ls -l --time-style='+%Y-%m-%d'

    或者

    find . -type f -mtime +5 -exec ls -l --time-style='+%Y-%m-%d' {} \;

    注意一定是{} \;别漏掉了分号。{}是指find . -type f -mtime +5的返回的结果,\;是指命令尾部标记。
    结合了ls命令,我们上面讲到的ls的选项就都可以使用了。

  6. 那么为什么说不加-type f使用find 会有问题了?因为当我们查看5天以内的文件的时候,竟然查出了所有!!!
    结果实验发现find . -mtime -5 输出的结果中竟然有.,即当前目录,即使你使用绝对路径find也一样会返回当前目录。此时当前目录被作为输出的find的返回结果一部分传送给ls,即 ls .,这样自然就把当前目录下的所有文件都打印出来了。

find命令的还能很多用法,man手册还是很意思的。如有不准确的地方,欢迎大家指正!!

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页