Skip to content

04 文件内容查阅与文件属性

1. 查阅文件内容

命令:

  • nl:输出时显示行号。默认不列出空行的行号,与cat相反。
  • less:可以向前翻页,man调用此命令显示
  • od:以二进制的方式读取文件内容
  • head:行数为负数时,列出总行数-行数的前几行

比如,有一个文件是100行,head -n -60 file 会显示前40行。

  • tail:行数为正数+N(比如+25)时,列出第N行(包括第N行)以后的行

比如,有一个文件是100行,tail -n +60 file 会显示60行开始以后的行。

假设/etc/man_db.conf有100行,截取第31~55行之间的内容:

[shark@linux ~]$ cat -n /etc/man_db.conf | head -n -45 | tail -n +31
# 或者
[shark@linux ~]$ cat -n /etc/man_db.conf | head -55 | tail -32

2. 文件状态

stat [OPTION]... FILE...
Display file or file system status.

    -f, --file-system     display file system status instead of file status
[root@centos7 ~]# stat ttt
  File: ‘ttt’
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 8409185     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-04-11 23:05:46.388101352 +0800
Modify: 2020-04-11 23:05:46.388101352 +0800
Change: 2020-04-11 23:05:46.388101352 +0800
 Birth: -

3. 文件时间

  • modification timemtime): 当该文件的内容变更时,就会更新这个时间。ls默认显示此时间。
  • change timectime): 当该文件的状态改变时,就会更新这个时间。比如权限、属性、大小被更改了,都会更新这个时间。ls -cl
  • access timeatime): 当该文件的内容被取用时,就会更新这个读取时间 。 举例来说,我们使用 cat 去读取 /etc/man_db.conf,就会更新该文件的 atime 了 。ls -ul
# 实际上默认显示的就是mtime,--time的参数中没有该选项
[shark@linux ~]$ ll root_data ; ll --time=atime root_data ; ll --time=ctime root_data
-rw-------. 1 root root 0 Aug  1 16:52 root_data
-rw-------. 1 root root 0 Aug  1 16:53 root_data
-rw-------. 1 root root 0 Aug  7 11:31 root_data

3.1 touch命令修改文件时间

touch [OPTION]... FILE...
Update the access and modification times of each FILE to the current time.

    -a                     change only the access time
    -c, --no-create        do not create any files
    -d, --date=STRING      parse STRING and use it instead of current time
    -m                     change only the modification time
    -r, --reference=FILE   use this file's times instead of current time
    -t STAMP               use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. 文件/目录隐藏属性

4.1 chattr改变文件/目录隐藏属性

需要看文件系统(xfs、ext4等)是否支持这些属性。

chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...
- R:对目录递归地改变属性 - + : 增加某一个特殊参数, 其他原 本存在参数则 不动。 - - : 移除某一个特殊参数, 其他原 本存在参数则 不动。 - = :设置一定, 且仅有后面接的参数。 - a: 让一个文件只能在追加模式下打开以进行写入。也不能进行删除、修改等操作。只有 root 能设置或清除此属性。 - i: 让一个文件“不能被删除、改名、设置链接、无法写入或新增数据。只有 root 能设置或清除此属性。 - A:有存取此文件( 或目录)时,他的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。( 目前建议使用文件系统挂载参数处理这个项目)

4.2 lsattr显示文件/目录隐藏属性

lsattr [ -RVadv ] [ files...  ]

选项类似与ls

$ chattr +i upgrade-nodes.yml.bak
$ rm upgrade-nodes.yml.bak
rm: remove regular file ‘upgrade-nodes.yml.bak’? y
rm: cannot remove ‘upgrade-nodes.yml.bak’: Operation not permitted
$ mv upgrade-nodes.yml.bak goaway
mv: cannot move ‘upgrade-nodes.yml.bak’ to ‘goaway’: Operation not permitted
$ lsattr upgrade-nodes.yml.bak
----i----------- upgrade-nodes.yml.bak
$ chattr -i upgrade-nodes.yml.bak

5. 寻找文件

5.1 whereis

whereis [options] file

Options:
 -b         search only for binaries
 -B <dirs>  define binaries lookup path
 -m         search only for manuals
 -M <dirs>  define man lookup path
 -s         search only for sources
 -S <dirs>  define sources lookup path
 -f         terminate <dirs> argument list
 -u         search for unusual entries,查找不在-b、-m、-s中的文件
 -l         output effective lookup paths

主要查找二进制文件和man手册文件。

5.2 locate

locate [OPTION]... [PATTERN]...
Search for entries in a mlocate database.

  -A, --all              only print entries that match all patterns
  -b, --basename         match only the base name of path names。即查询只有文件名包含PATTERN的文件
  -c, --count            only print number of found entries
  -d, --database DBPATH  use DBPATH instead of default database (which is
                         /var/lib/mlocate/mlocate.db)
  -e, --existing         only print entries for currently existing files
  -L, --follow           follow trailing symbolic links when checking file
                         existence (default)
  -i, --ignore-case      ignore case distinctions when matching patterns
  -l, --limit, -n LIMIT  limit output (or counting) to LIMIT entries
  -P, --nofollow, -H     don't follow trailing symbolic links when checking file
                         existence
  -0, --null             separate entries with NUL on output
  -S, --statistics       don't search for entries, print statistics about each
                         used database
  -q, --quiet            report no error messages about reading databases
  -r, --regexp REGEXP    search for basic regexp REGEXP instead of patterns
      --regex            patterns are extended regexps
  -w, --wholename        match whole path name (default)

CentOS 7.x 是每天更新数据库一次,使用updatedb手动更新。

5.3 find

find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

默认路径是当前目录;默认 expression 是 -print;
expression 有以下四种: operators(操作符), options, tests, and actions:

operators (优先级是递减;没有指定的话就是 -and ):
      括号:( EXPR )   
      非:! EXPR   -not EXPR   
      与:EXPR1 -a EXPR2   EXPR1 -and EXPR2
      或:EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2

positional options (always true): -daystart -follow -regextype

normal options (always true, specified before other expressions):
      -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
      --version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race

tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
      -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
      -links N -lname PATTERN -mmin N 
      -mtime N (N:在N天之前的一天之内被改动过的文件;+N:在N天之前(不包含N天本身)被改动过的文件;-N:在N天之内(包含N天本身)被改动过的文件)
      -name PATTERN
      -newer FILE (列出比 FILE 还要新的文件文件名)
      -nouser -nogroup -path PATTERN 
      -perm [-/]MODE (-MODE:查找权限包含该MODE的文件;/MODE:查找含有该MODE任意权限的文件。MODE只能是数字表示法)
      -regex PATTERN
      -readable -writable -executable
      -wholename PATTERN -size N[bcwkMG] -true 
      -type [bcdpflsD] (一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),socket(s) ,及 FIFO(p))
      -uid N
      -used N -user NAME -xtype [bcdpfls]
      -context CONTEXT


actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
# 列出当前文件夹下的今天改动的文件
$ find . -mtime 0
$ find . -mtime -1
# 查找包含SUID、SGID、SBIT权限的文件
$ find . -perm /7000