Linux文件与目录管理


系统目录结构

根目录

[root@centos-01 ~]# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

tree命令


[root@centos-01 ~]# tree
-bash: tree: 未找到命令
[root@centos-01 ~]# yum install -y tree
[root@centos-01 ~]# man tree

按“q”退出

下面的讲解中,会结合tree命令来使用,这里不单独列出。

查看依赖的库文件

[root@centos-01 ~]# ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007ffebd365000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2327bd0000)
    libcap.so.2 => /lib64/libcap.so.2 (0x00007f23279cb000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00007f23277c1000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f23273fe000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f232719c000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f2326f97000)
    /lib64/ld-linux-x86-64.so.2 (0x000055f23d3ea000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00007f2326d92000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2326b76000)

which命令

使用which命令查看ll命令的绝对路径

[root@centos-01 ~]# which ll
alias ll='ls -l --color=auto'
    /usr/bin/ls

alias命令

列出当前系统中所有已经定义的命令别名

[root@centos-01 ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

mkdir命令

‘mkdir’其实就是make directory的缩写。

[root@centos-01 ~]# ls /tmp/
systemd-private-6a1c12c233874baa8f78ed09e8a5cba4-chronyd.service-aD4KHq
systemd-private-6a1c12c233874baa8f78ed09e8a5cba4-vgauthd.service-ujYl4n
systemd-private-6a1c12c233874baa8f78ed09e8a5cba4-vmtoolsd.service-JNmrCm
[root@centos-01 ~]# mkdir /tmp/test1
[root@centos-01 ~]# ls -ld /tmp/test1/
drwxr-xr-x. 2 root root 6 120 18:10 /tmp/test1/
[root@centos-01 ~]# date
20180120日 星期六 18:10:57 CST

要创建的目录的上一级目录不存在就会报错,可加上‘-p’选项

[root@centos-01 ~]# mkdir /tmp/test1/1/2
mkdir: 无法创建目录"/tmp/test1/1/2": 没有那个文件或目录
[root@centos-01 ~]# mkdir -p /tmp/test1/1/2
[root@centos-01 ~]# tree /tmp/test1/
/tmp/test1/
└── 1
    └── 2

2 directories, 0 files
[root@centos-01 ~]# ls -l /tmp/test1/
总用量 0
drwxr-xr-x. 3 root root 15 120 18:12 1
[root@centos-01 ~]# ls -l /tmp/test1/1/
总用量 0
drwxr-xr-x. 2 root root 6 120 18:12 2
[root@centos-01 ~]# mkdir -pv /tmp/test1/3/4
mkdir: 已创建目录 "/tmp/test1/3"
mkdir: 已创建目录 "/tmp/test1/3/4"

rmdir命令

remove directory的简写,‘rmdir’只能删除空目录,即使加上‘-p’选项也只能删除一串的空目录。

rm命令

既可以删除目录又可以删除文件。

[root@centos-01 ~]# rm -r /tmp/test1/3/
rm:是否进入目录"/tmp/test1/3/"? y
rm:是否删除目录 "/tmp/test1/3/4"?y
rm:是否删除目录 "/tmp/test1/3/"?y
[root@centos-01 ~]# tree /tmp/test1/
/tmp/test1/
└── 1
    └── 2

2 directories, 0 files
[root@centos-01 ~]# rm -rf /tmp/test1/
[root@centos-01 ~]# ls /tmp/
systemd-private-6a1c12c233874baa8f78ed09e8a5cba4-chronyd.service-aD4KHq
systemd-private-6a1c12c233874baa8f78ed09e8a5cba4-vgauthd.service-ujYl4n
systemd-private-6a1c12c233874baa8f78ed09e8a5cba4-vmtoolsd.service-JNmrCm

环境变量PATH

  • 打印环境变量
[root@centos-01 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  • 临时添加环境变量(仅对当前终端有效)
PATH=$PATH:要添加的路径
  • 永久添加环境变量
[root@centos-01 ~]# vi /etc/profile
     在最后添加PATH=$PATH:要添加的路径,保存退出

cp命令

copy的简写。cp test01 test02,把test01拷贝成test02。拷贝目录时,目录斜杠‘/’最好写全。

  • -r: 拷贝目录,必须要加-r选项,和‘rm命令’类似
[root@centos-01 ~]# which cp
alias cp='cp -i'
    /usr/bin/cp

rm命令也有-i选项


[root@centos-01 ~]# which rm
alias rm='rm -i'
    /usr/bin/rm
  • -i: 安全选项,和‘rm’类似,如果遇到一个存在的文件,会问是否覆盖。在Redhat/CentOS系统中,我们使用的cp其实是cp -i。如果不想被问是否覆盖,即不用-i选项,使用/usr/bin/cp即可。

mv命令

move的简写。

  • -i: 和cp-i一样,当目标文件存在时会问用户是否要覆盖。在Redhat/CentOS系统中,我们使用的mv其实是mv -i
[root@centos-01 ~]# which mv
alias mv='mv -i'
    /usr/bin/mv

如果不想被问是否覆盖,即不用-i选项,使用/usr/bin/mv即可。
如果在同一个目录下操作,且目标不存在,相当于改名字。如果目标文件已存在,则会问是否覆盖。如果目标为目录,且目录存在,则移动到目标目录下。

cat命令

查看文件内容(正序)。tac命令,倒序查看文件内容。

  • -n: 查看文件时,把行号也显示到屏幕上。
  • -A: 显示所有东西出来,包括特殊字符(等价于-vET

more命令

当文件内容太多,一屏幕不能占下,使用more命令,当看完一屏后按空格键继续看下一屏。看完所有内容后就会退出。如果想提前退出,只需按‘q’键即可。按’B’或’Ctrl+B’,显示上一屏内容。

less命令

作用跟more一样,后面直接跟文件名,但比more好在可以用方向键上下翻,空格键同样可以翻页,而按‘J’键可以向下移动(按一下就向下移动一行),按‘K’键向上移动(按一下就向上移动一行)。按’B’或’Ctrl+B’,显示上一屏内容。按’F’或’Ctrl+F’,显示下一屏内容。看完所有内容后不像more那样自动退出,只有按‘Q’键才会退出。按‘g’定位到文件首,按‘Shift+G’定位到文件尾。

在使用less查看某个文件时,你可以按一下‘/’键,然后输入一个word回车,这样就可以查找这个word了。如果是多个该word可以按‘n’键显示下一个,‘Shift+N’显示前一个。另外按‘?’后边同样跟word来搜索这个word,这时按‘n’键显示前一个,‘Shift+N’显示下一个。 ‘/’是在当前行向下搜索,而‘?’是在当前行向上搜索。

head命令

‘head’后直接跟文件名,则显示文件的前十行。如果加-n选项则显示文件前n行。

tail命令

和head类似,后面直接跟文件名,则显示文件最后十行。如果加-n选项则显示文件最后n行。

  • -f: 动态显示文件的最后十行。如果文件是不断增加的,则用-f选项。如:tail -f /var/log/messages

更改文件的权限

chmod命令

“change mode”缩写,改变用户对文件的读写执行权限。在Linux系统中,默认一个目录的权限为755,而一个文件的默认权限为644。在密钥认证时,使用过chmod。

[root@localhost ~]# chmod 700 /root/.ssh

现在查看/root/.ssh/

[root@centos-01 ~]# ls -ld /root/.ssh/
drwx------. 2 root root 48 118 15:40 /root/.ssh/

权限为700

  • -R:(–recursive)以递归方式更改所有的文件及子目录

’chmod’还支持使用rwx的方式来设置权限。基本上有九个属性分别是(1)user (2)group (3)others,可以使用u、g、o来代表它们三个的属性,此外,a则代表all亦即全部。

例如:

chmod u=rwx,og=rx test/test2
chmod a-x test/test2

chgrp命令

‘chgrp’命令可以更改文件的所属组,还可以更改目录的所属组,但是只能更改目录本身,而目录下面的目录或者文件没有更改,要想级联更改子目录以及子文件,使用-R选项可以实现。

chown命令

更改文件的所属主。

chown -R user1:testgroup test

把test目录以及目录下的文件都修改成所属主为user1,所属组为testgroup。

  • 用法总结:chown -R username:group filename

umask命令

默认情况下,目录权限值为755, 普通文件权限值为644,这和默认权限值有关。默认值可以修改,不过目录必须要有x权限(执行权限)。查看umask值只要输入‘umask’然后回车。

[root@centos-01 ~]# umask
0022

umask预设是0022。

  • 若用户建立为普通文件,则预设‘没有可执行权限’,只有’rw’两个权限。最大为666 (‘-rw-rw-rw-‘)
  • 若用户建立为目录,则预设所有权限均开放,即777 (‘drwxrwxrwx’)

umask数值代表的含义为,上边两条规则中的默认值(文件为666,目录为777)需要减掉的权限。所以目录的权限为 ‘rwxrwxrwx’ - ‘—-w–w-’ = ‘rwxr-xr-x’,普通文件的权限为 ‘rw-rw-rw-’ - ‘—-w–w-’ = ‘rw-r–r–’。
umask后面加数字可以修改默认值,比如umask 0002

隐藏权限

chattr命令

change file attributes on a Linux file system,设置隐藏权限。

  • 语法:chattr [+-=][ASaci] [文件或者目录名]
  • ‘+-=’ : 分别为增加、减少、设定
  • ‘A’ : 增加该属性后,文件或目录的atime将不可被修改;
  • ‘S’ : 增加该属性后,会将数据同步写入磁盘中;
  • ‘a’ : 增加该属性后,只能追加不能删除,非root用户不能设定该属性;
  • ‘c’ : 自动压缩该文件,读取时会自动解压;
  • ‘i’ : 增加后,使文件不能被删除、重命名、设定链接接、写入、新增数据。

lsattr命令

查看隐藏权限。

  • 语法:lsattr [-aRd] [文件/目录名]
  • ‘-a’ : 类似ls 的-a 选项,即连同隐藏文件一同列出;
  • ‘-R’ : 连同子目录的数据一同列出
  • ‘-d’ : 查看目录本身,类似ls -d

特殊权限

特殊权限set uid

[root@centos-01 ~]# which passwd
/usr/bin/passwd
[root@centos-01 ~]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 610 2014 /usr/bin/passwd
[root@centos-01 ~]# ls -l /etc/shadow
----------. 1 root root 585 1227 05:28 /etc/shadow

passwd有set uid权限(小写srwsr-xr-x)。set uid保证普通用户临时拥有该命令所有者的‘身份’(使文件执行阶段具有文件所有者的权限),只能给二进制可执行文件设置set uid。

[root@centos-01 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls
[root@centos-01 ~]# chmod u+s /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls
[root@centos-01 ~]# chmod u-s /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls
[root@centos-01 ~]# chmod u=rws /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwSr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls
[root@centos-01 ~]# chmod u+x /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls
[root@centos-01 ~]# chmod u-s /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls

比如,切换到普通用户执行ls -l /root/,会提示权限不够,普通用户没有权限查看/root/目录内容。这时在root用户下,执行chmod u+s /usr/bin/ls,给/usr/bin/ls命令添加set uid权限,再执行ls -l /root/就可以了。执行chmod u-s /usr/bin/ls,给/usr/bin/ls命令去掉set uid权限。有时候会看到‘S’而不是‘s’,s变成S,是由于所有者没有‘x’执行权限。比如,执行chmod u=rws /usr/bin/ls,这时ls -l /usr/bin/ls显示S,再执行chmod u+x /usr/bin/ls,这时ls -l /usr/bin/ls显示s

特殊权限set gid

普通用户临时拥有所属组的身份

[root@centos-01 ~]# chmod g+s /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwxr-sr-x. 1 root root 117656 116 2016 /usr/bin/ls
[root@centos-01 ~]# chmod g-s /usr/bin/ls
[root@centos-01 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117656 116 2016 /usr/bin/ls

该权限可以应用在文件上和目录上。设置在文件上,作用和set uid类似,当设置set gid后,执行该文件的用户会临时以该文件所属组的身份执行。若目录被设置这个权限后,任何用户在此目录下创建的文件或目录都和该目录所属组保持一致。

特殊权限stick_bit

该特殊权限针对目录设置,从单词字面上理解,叫粘滞位,就像被胶水粘住一样,所以也叫做防删除位,目的是为了防止被别的用户删除(root用户除外,它是超级管理员,防止不了)。系统本身的tmp目录,就带有这样的权限。

[root@centos-01 ~]# ls -ld /tmp/
drwxrwxrwt. 10 root root 4096 29 13:24 /tmp/

/tmp是系统的临时文件目录,所有的用户在该目录下拥有所有的权限,也就是说在该目录下可以任意创建、修改、删除文件。如果用户A在该目录下创建了一个文件,用户B将该文件删除了,这种情况我们是不能允许的。为了达到该目的,就出现了stick bit(粘滞位)的概念。它是针对目录来说的,如果该目录设置了stick bit(粘滞位),则该目录下的文件只允许该文件的创建者和root用户可以删除和修改。

  • 设置stick_bit权限
chmod o+t 目录

Linux的链接文件

链接文件分为两种,硬链接和软链接。两种链接的本质区别在于inode。

硬链接

当系统要读取一个文件时,就会先去读inode table,然后再去根据inode中的信息到块区域去将数据取出来。硬链接是直接使用了和源文件相同的inode,硬链接文件直接链接到文件放置的块区域。也就是说,进行硬链接的时候实际上该文件内容没有任何变化,只是指定了相同的inode。

硬链接有两个限制:

  1. 不能跨文件系统,因为不同的文件系统有不同的inode table;
  2. 不能链接目录。

软链接

跟硬链接不同,这个是建立一个独立的文件,而这个文件的作用是当读取这个链接文件时,它会把读取的行为转发到该文件所link的文件上。举个例子,现在有文件a,我们做了一个软链接文件b(只是一个链接文件,非常小),b指向了文件a。当读取b时,那么b就会把读取的动作转发到a上,这样就读取到了文件a。所以,当你删除文件a时,文件b并不会被删除,但是再读取b时,会提示无法打开文件。而当你删除b时,a是不会有任何影响的。目录是可以软链接的。

  • 查看bin的软链接
[root@centos-01 ~]# ls -l /bin
lrwxrwxrwx. 1 root root 7 1227 05:22 /bin -> usr/bin

ln命令

  • 语法:ln [-s] [源文件] [软链接文件]

ln常用的选项就一个’-s’,如果不加就是建立硬链接,加上就建立软链接。

Linux搜索文件

which命令

’which’用来查找可执行文件的绝对路径。’which’只能用来查找PATH环境变量中出现的路径下的可执行文件。

[root@centos-01 ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls
[root@centos-01 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

whereis命令

’whereis’通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件。

[root@centos-01 ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

locate命令

[root@centos-01 ~]# locate
-bash: locate: 未找到命令
[root@centos-01 ~]# yum install -y mlocate

‘locate’类似于’whereis’,也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪里。

[root@centos-01 ~]# locate ls
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录

这里因为刚安装完,系统还没有生成那个文件列表库,没有自动生成’ mlocate.db’数据库。

  • 手动生成(更新)这个库
[root@centos-01 ~]# updatedb

这时候再执行locate命令就可以了

[root@centos-01 ~]# locate ls

终端会显示很多搜索结果,不管是目录名还是文件名,只要包含搜索的关键词,都会列出来。

find命令

  • 语法:find [路径] [参数]
  • ‘-name filename’ 直接查找该文件名的文件
  • ‘-type filetype’ 通过文件类型查找,filetype包含了f、b、c、d、l、s等。
[root@centos-01 ~]# find /etc/ -name "sshd_config"
/etc/ssh/sshd_config
[root@centos-01 ~]# find /etc/ -name "sshd*"
/etc/ssh/sshd_config
/etc/systemd/system/multi-user.target.wants/sshd.service
/etc/sysconfig/sshd
/etc/pam.d/sshd
[root@centos-01 ~]# find /etc/ -type d -name "sshd*"
[root@centos-01 ~]# find /etc/ -type f -name "sshd*"
/etc/ssh/sshd_config
/etc/sysconfig/sshd
/etc/pam.d/sshd
[root@centos-01 ~]# find /dev/ -type b
/dev/sr0
/dev/sda3
/dev/sda2
/dev/sda1
/dev/sda
  • ‘-atime +n/-n’:访问或执行时间大于/小于n天的文件
  • ‘-ctime +n/-n’:写入、更改inode属性(例如更改所有者、权限或者链接)时间大于/小于n天的文件
  • ‘-mtime +n/-n’:写入时间大于/小于n天的文件

文件的Access time也就是’atime’是在读取文件或者执行文件时更改的。文件的Modified time也就是’mtime’是在写入文件时随文件内容的更改而更改的。文件的Change time也就是’ctime’是在写入文件、更改所有者、权限或链接设置时随inode的内容更改而更改的。 因此,更改文件的内容即会更改mtime和ctime,但是文件的ctime可能会在mtime未发生任何变化时更改。例如,更改了文件的权限,但是文件内容没有变化。

‘stat’命令可用来列出文件的atime、ctime和mtime。

[root@centos-01 ~]# ls
anaconda-ks.cfg
[root@centos-01 ~]# stat anaconda-ks.cfg 
  文件:"anaconda-ks.cfg"
  大小:1418       块:8          IO 块:4096   普通文件
设备:803h/2051d   Inode33582978    硬链接:1
权限:(0600/-rw-------)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2018-01-23 20:50:25.753568118 +0800
最近更改:2017-12-27 05:29:47.376971988 +0800
最近改动:2017-12-27 05:29:47.377971988 +0800
创建时间:-

改成英文看看

[root@centos-01 ~]# echo $LANG
zh_CN.UTF-8
[root@centos-01 ~]# LANG=en
[root@centos-01 ~]# stat anaconda-ks.cfg 
  File: 'anaconda-ks.cfg'
  Size: 1418        Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d  Inode: 33582978    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2018-01-23 20:50:25.753568118 +0800
Modify: 2017-12-27 05:29:47.376971988 +0800
Change: 2017-12-27 05:29:47.377971988 +0800
 Birth: -

再改回中文

[root@centos-01 ~]# LANG=zh_CN.UTF-8

mtime小于1天的文件

[root@centos-01 ~]# find /etc/ -type f -mtime -1
/etc/resolv.conf
/etc/group
/etc/gshadow
/etc/tuned/active_profile

使用find可找到指定inode号的文件(比较适用硬链接,一个inode号对应多个文件)

[root@centos-01 ~]# ls -i
33582978 anaconda-ks.cfg
[root@centos-01 ~]# find / -inum 33582978
/root/anaconda-ks.cfg
  • ‘-o’:或者的意思

mtime小于600分钟

[root@centos-01 ~]# find /root/ -type f -mmin -600 -exec ls -l {} ;
-rw-------. 1 root root 2869 3月  25 11:39 /root/.bash_history

文件小于10k

[root@centos-01 ~]# find /root/ -type f -size -10k -exec ls -lh {} ;
-rw-r--r--. 1 root root 18 1229 2013 /root/.bash_logout
-rw-r--r--. 1 root root 176 1229 2013 /root/.bash_profile
-rw-r--r--. 1 root root 176 1229 2013 /root/.bashrc
-rw-r--r--. 1 root root 100 1229 2013 /root/.cshrc
-rw-r--r--. 1 root root 129 1229 2013 /root/.tcshrc
-rw-------. 1 root root 1.4K 1227 05:29 /root/anaconda-ks.cfg
-rw-------. 1 root root 2.9K 325 11:39 /root/.bash_history
-rw-r--r--. 1 root root 177 118 12:59 /root/.ssh/known_hosts
-rw-r--r--. 1 root root 1.2K 118 15:40 /root/.ssh/authorized_keys
-rw-------. 1 root root 41 124 00:01 /root/.lesshst

使用Xshell / SecureCRT,在Linux和Windows之间互传文件

[root@centos-01 ~]# yum install -y lrzsz

sz命令

发送服务器(Linux)文件到本地(Windows):

sz filename

rz命令

本地(Windows)上传文件到服务器(Linux):

rz

执行该命令后,在弹出框中选择要上传的文件即可,文件会上传到终端当前目录下。

原文地址:https://www.cnblogs.com/Genesis2018/p/8998097.html