鸟哥的Linux私房菜读书笔记--文件的相关操作

文件权限的相关操作请查看:https://mp.csdn.net/postedit/81407821

1、观察文件类型

命令:$  file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本档啊!
命令:$  file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
# 执行文件的数据可就多的不得了!包括这个文件的 suid 权限、兼容于 Intel x86-64 等级的硬件平台
# 使用的是 Linux 核心 2.6.32 的动态函式库链接等等。
命令:$  file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 这是 data 文件!

指令与文件的搜索

1、脚本文件名的搜索

命令:$  which (寻找『执行档』)
命令:$  which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
范例三:请找出 history 这个指令的完整文件名
命令:$   which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
which指令是根据『PATH』这个环境变量所规范的路径,去搜寻『执行档』的档名~ 所以,重点是
找出『执行档』而已!且 which 后面接的是『完整档名』
怎么 history 这个常用的指令竟然找不到啊!为什么呢?这是因为 history 是『bash 内建的指令』啦! 但是 which 预设是找 PATH 内所规范的目录,所以当然一定找不到的啊(有 bash 就有 history!)!我们可以透过 type 这个指令喔! 

2、文档名的搜索

whereis (由一些特定的目录中寻找文件文件名)
命令:$  whereis [-bmsu] 文件或目录名
选项与参数:
     -l :可以列出 whereis 会去查询的几个主要目录而已
    -b :只找 binary 格式的文件
    -m :只找在说明文件 manual 路径下的文件
    -s :只找 source 来源文件
    -u :搜寻不在上述三个项目当中的其他特殊文件

 locate / updatedb    ##在已建立的数据库  /var/lib/mlocate 中寻找,不在硬盘中直接存储数据
命令:$  locate [-ir] keyword
选项与参数:
     -i :忽略大小写的差异;
    -c :不输出档名,仅计算找到的文件数量
    -l :仅输出几行的意思,例如输出五行则是 -l 5
    -S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
    -r :后面可接正规表示法的显示方式

find

命令: $   find [PATH] [option] [action]
选项与参数:


1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
     -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
     -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
     -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
     -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
命令: $  find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!
范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
命令:$  find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的!但如果我想要找出『4 天内被更动过的文件档名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4 天前的那一天』就用『 find /var -mtime 4 』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:


图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。
<1>+4 代表大于等于 5 天前的檔名:ex> find /var -mtime +4
<2>-4 代表小于等于 4 天内的文件档名:ex> find /var -mtime -4
<3> 4 则是代表 4-5 那一天的文件档名:ex> find /var -mtime 4

选项与参数:


2. 与使用者或组名有关的参数:
     -uid n :n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在 /etc/passwd 里面与账号名称对应的数字。                     这方面我们会在第四篇介绍。
    -gid n :n 为数字,这个数字是组名的 ID,亦即 GID,这个 GID 记录在 /etc/group,相关的介绍我们会第四篇说明~
    -user name :name 为使用者账号名称喔!例如 dmtsai
    -group name:name 为组名喔,例如 users ;
    -nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
    -nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!
           当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 这是可能的!在这个时候,就可以使用 -nouser               与 -nogroup 搜寻。
范例三:搜寻 /home 底下属于 dmtsai 的文件
命令:$  find /home -user dmtsai
# 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!
范例四:搜寻系统中不属于任何人的文件
命令:$  find / -nouser
# 透过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软件时。

选项与参数:


3. 与文件权限及名称有关的参数:
     -name filename:搜寻文件名为 filename 的文件;
     -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
     c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是『 -size +50k 』
    -type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c),目录 (d), 连结                                                       档 (l), socket (s), 及 FIFO (p) 等属性。
   -perm mode :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的                               属性为 4755 !
  -perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的                             文件,使用 -perm -0744,当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,因为 -rwsr-xr-                                x 的属性已经囊括了 -rwxr--r-- 的属性了。
  -perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻-rwxr-xr-x ,亦即 -perm /755 时,但                              一个文件属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在!
范例五:找出档名为 passwd 这个文件
命令:$  find / -name passwd
范例五-1:找出文件名包含了 passwd 这个关键词的文件
命令:$   find / -name "*passwd*"
# 利用这个 -name 可以搜寻档名啊!默认是完整文件名,如果想要找关键词,
# 可以使用类似 * 的任意字符来处理
范例六:找出 /run 目录下,文件类型为 Socket 的檔名有哪些?
命令:$   find /run -type s
# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!
范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
命令:$   find / -perm /7000 
# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
# 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000 ~瞭乎?

选项与参数:


4. 额外可进行的动作:
     -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
     -print :将结果打印到屏幕上,这个动作是预设动作!
范例八:将上个范例找到的文件使用 ls -l 列出来~
命令:$  find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;

<1> {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
<2> -exec 一直到 \; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在           例中就是『 ls -l {} 』啰!
<3> 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来跳脱。

# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,所以仅能使用 ls -l 不可以使用 ll 喔!注意注意!
范例九:找出系统中,大于 1MB 的文件
命令:$  find / -size +1M

5、实体链接与符号链接:ln

命令:$ ln [-sf] 来源文件 目标文件
选项与参数:
     -s :如果不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbolic link
     -f :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立!
范例一:将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block
命令:$ cd /tmp
命令:$ cp -a /etc/passwd .
命令:$ du -sb ; df -i .
6602 . <==先注意一下这里的容量是多少!
Filesystem                        Inodes       IUsed      IFree      IUse%   Mounted on
/dev/mapper/centos-root  10485760  109748  10376012  2%              /
# 利用 du 与 df 来检查一下目前的参数~那个 du -sb 是计算整个 /tmp 底下有多少 bytes 的容量啦!
范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 文件,并观察文件与容量
命令:$  ln passwd passwd-hd
命令:$  du -sb ; df -i .
6602 .
Filesystem                           Inodes I     Used        IFree         IUse%    Mounted on
/dev/mapper/centos-root    10485760   109748    10376012    2%              /
# 仔细看,即使多了一个文件在 /tmp 底下,整个 inode 与 block 的容量并没有改变!
命令:$   ls -il passwd*
2668897  -rw-r--r--.  2  root  root  2092  Jun  17  00:20  passwd
2668897  -rw-r--r--.  2  root  root  2092  Jun  17  00:20  passwd-hd
# 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会增加!
范例三:将 /tmp/passwd 建立一个符号链接
命令:$   ln -s passwd passwd-so
命令:$   ls -li passwd*
2668897  -rw-r--r--.      2  root  root  2092  Jun  17 00:20    passwd
2668897  -rw-r--r--.      2  root  root  2092  Jun  17 00:20    passwd-hd
2668898  lrwxrwxrwx.  1  root  root  6        Jun   23 22:40   passwd-so -> passwd
# passwd-so 指向的 inode number 不同了!这是一个新的文件~这个文件的内容是指向
# passwd 的。passwd-so 的大小是 6bytes ,因为 『passwd』 这个单字共有六个字符之故
命令:$  du -sb ; df -i .
6608 .
Filesystem                          Inodes        IUsed      IFree        IUse%     Mounted on
/dev/mapper/centos-root    10485760   109749   10376011   2%               /
# 呼呼!整个容量与 inode 使用数都改变啰~确实如此啊!
范例四:删除源文件 passwd ,其他两个文件是否能够开启?
命令:$  rm passwd
命令:$  cat passwd-hd
.....(正常显示完毕!)
命令:$  cat passwd-so
cat: passwd-so: No such file or directory
命令:$  ll passwd*
-rw-r--r--.      1  root  root  2092  Jun   17 00:20  passwd-hd
lrwxrwxrwx.  1  root  root  6        Jun   23 22:40  passwd-so -> passwd
# 怕了吧!符号链接果然无法开启!另外,如果符号链接的目标文件不存在,
# 其实档名的部分就会有特殊的颜色显示喔!

使用ln不加任何参数的话就是hardlink

猜你喜欢

转载自blog.csdn.net/qq_41825534/article/details/82775338
今日推荐