文件及用户管理
一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
1. 目录管理类的命令:mkdir、rmdir
mkdir - make directories
mkdir [OPTION]... DIRECTORY...
option:
- -p,--parents:自动创建父目录;
- -v,--verbose:显示详细过程;
- -m,--mode=MODE:创建目录并设置目录的权限;
- --context[=CTX]:设置SELinux权限;
e.g.
-
在/tmp目录下创建dirtmp/upload目录
[root@node1 ~]# mkdir -v /tmp/dirtmp/upload mkdir: cannot create directory ‘/tmp/dirtmp/upload’: No such file or directory [root@node1 ~]# mkdir -pv /tmp/dirtmp/upload mkdir: created directory ‘/tmp/dirtmp’ mkdir: created directory ‘/tmp/dirtmp/upload’
rmdir - remove empty directories
rmdir [OPTION]... DIRECTORY...
option:
- -p:删除空目录,包括空的父目录;
- -v: 显示详细过程;
e.g.
- 删除/tmp/x/z/y目录,若父目录为空,也一并删除
[root@node1 ~]# rmdir -pv /tmp/x/y/z/ rmdir: removing directory, ‘/tmp/x/y/z/’ rmdir: removing directory, ‘/tmp/x/y’ rmdir: removing directory, ‘/tmp/x’ rmdir: removing directory, ‘/tmp’ rmdir: failed to remove directory ‘/tmp’: Directory not empty [root@node1 ~]#
2. 文件查看类命令:cat, tac, head, tail, more, less、touch,stat
cat - concatenate files and print on the standard output
cat [OPTION]... [FILE]...
option:
- -A, --show-all,-vET:显示所有符号;
- -E, --show-ends:显示行结束符;
- -n, --number:显示行号;
- -T, --show-tabs:显示制表符;
- -v, --show-nonprinting:显示非打印字符;
e.g.
-
显示/etc/issue的所有符号和行号
[root@node1 ~]# cat -An /etc/issue 1 \S$ 2 Kernel \r on an \m$ 3 $ [root@node1 ~]#
tac - concatenate and print files in reverse
tac [OPTION]... [FILE]...
e.g.
-
显示/etc/issue的内容
[root@node1 ~]# tac /etc/issue Kernel \r on an \m \S
head - output the first part of files
head [OPTION]... [FILE]...
option:
- -c, --bytes=[-]K:显示指定的字节数;
- -n, --lines=[-]K:显示的行数,-n 5可写成-5,默认为10行;
- -q, --quiet, --silent:不打印文件名
- -v, --verbose:打印文件名
e.g.
-
显示/etc/passwd的前5行,并显示出文件名
[root@node1 ~]# head -5 -v /etc/passwd ==> /etc/passwd <== root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-
显示/etc/passwd的前20字节
[root@node1 ~]# head -c 20 /etc/passwd root:x:0:0:root:/roo[root@node1 ~]#
tail - output the last part of files
tail [OPTION]... [FILE]...
option:
- -c, --bytes=K:显示指定的字节数;
- -f, --follow[={name|descriptor}]:查看文件尾部内容且不退出;
- -n, --lines=K:显示的行数,默认为10行;
- -q, --quiet, --silent:不打印文件名
- -v, --verbose:打印文件名
e.g.
-
显示/etc/passwd的后5行,并显示出文件名
[root@node1 ~]# tail -n 5 -v /etc/passwd ==> /etc/passwd <== polkitd:x:997:995:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin zsjshao:x:1000:1000::/home/zsjshao:/bin/bash [root@node1 ~]#
-
显示/etc/passwd文件内容不退出(Ctrl+c退出)
[root@node1 ~]# tail -f /tmp/test test line new line
more - file perusal filter for crt viewing
more [options] file [...]
option:
- +/string :查找指定字符并显示向后的行;
- +number:打开文件并从number行向后显示;
e.g.
-
使用more命令从第15行开始显示/etc/passwd文件内容;
[root@node1 ~]# more +15 /etc/passwd systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:997:995:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin zsjshao:x:1000:1000::/home/zsjshao:/bin/bash [root@node1 ~]#
less - opposite of more
less [option] [filename]...
翻屏:
- 空格键:向文件尾翻一屏;
- b: 向文件首部翻一屏;
- Ctrl+d:向文件尾部翻半屏;
- Ctrl+u:向文件首部翻半屏;
- 回车键:向文件尾部翻一行;
- k: 向文件首部翻一行;
- G:跳转至最后一行;
- #G: 跳转至指定行;
- 1G:跳转至文件首部;
文本搜索:
- /keyword:从文件首部向文件尾部依次查找;不区分字符大小写;
- ?keyword:从文件尾部向文件首部依次查找;
- n: 与查找命令方向相同;
- N: 与查找命令方向相反;
退出:
- q: quit
e.g.
-
使用less命令查看/etc/init.d/functions文件
[root@node1 ~]# less /etc/init.d/functions # -*-Shell-script-*- # # functions This file contains functions to be used by most or all # shell scripts in the /etc/init.d directory. # TEXTDOMAIN=initscripts ...
stat - display file or file system status
stat [OPTION]... FILE...
e.g.
-
查看/etc/issue的文件属性信息
[root@node1 ~]# stat /etc/issue File: ‘/etc/issue’ Size: 23 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 67109017 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:etc_t:s0 Access: 2019-03-31 12:20:00.000000000 +0800 Modify: 2015-12-09 17:59:15.000000000 +0800 Change: 2019-03-31 22:24:34.701000000 +0800 Birth: - [root@node1 ~]#
touch - change file timestamps
touch [OPTION]... FILE...
option:
- -c, --no-create:不创建空文件;
- -t STAMP:[[CC]YY]MMDDhhmm[.ss]
- -r, --reference=FILE:参考给定的文件设置时间戳
- -a:仅修改访问时间(Access time)
- -m:仅修改修改时间(Modify time)
e.g.
-
仅修改/etc/issue的访问时间为3月31日12点20分
[root@node1 ~]# touch -a -t 03311220 /etc/issue
3. 文件管理工具:cp、mv、rm
cp - copy files and directories
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
单源复制
- cp [OPTION]... [-T] SOURCE DEST
- 如果DEST不存在:则事先创建此文件,并复制源文件的数据流至DEST中;
- 如果DEST存在:
-
- 如果DEST是非目录文件:则覆盖目标文件;
-
- 如果DEST是目录文件:则先在DEST目录下创建一个与源文件同名的文件,并复制其数据流;
多源复制
- cp [OPTION]... SOURCE... DIRECTORY
- cp [OPTION]... -t DIRECTORY SOURCE...
- 如果DEST不存在:错误;
- 如果DEST存在:
-
- 如果DEST是非目录文件:错误;
-
- 如果DEST是目录文件:分别复制每个文件至目标目录中,并保持原名;
option:
- -a, --archive,-dR --preserve=all:归档;
- -d,--no-dereference --preserve=links:复制符号链接本身,而非源文件;
- -f, --force:强制执行;
- -i, --interactive:交互模式;
- -L, --dereference:复制源文件;
- -p,--preserve=mode,ownership,timestamps:保留权限、属主属组、时间戳
- --preserve[=ATTR_LIST]:要保留的属性:mode(权限),ownership(属主属组),timestamps(时间戳),context(安全标签),links(符号链接),xattr(扩展属性),all(所有属性);
- -R, -r, --recursive:递归复制目录
e.g.
-
复制/etc/fstab到/tmp/目录下并重命名为fstab.tmp且保留文件的权限、属主属组、时间戳属性;
[root@node1 ~]# cp -p /etc/fstab /tmp/fstab.tmp
-
复制/etc目录到tmp目录并保留所有属性
[root@node1 ~]# cp -a /etc /tmp
二、bash基础特性:命令行展开
~:自动展开为用户的家目录,或指定的用户的家目录;
{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
e.g.
-
使用命令行展开功能,创建/tmp/a1, /tmp/a2, /tmp/a1/a, /tmp/a1/b,在/tmp目录下创建目录:x_y, x_z, q_y, q_z
[root@node1 ~]# mkdir -pv /tmp/{a1/{a,b},a2} /tmp/{x,q}_{y,z} mkdir: created directory ‘/tmp/a1’ mkdir: created directory ‘/tmp/a1/a’ mkdir: created directory ‘/tmp/a1/b’ mkdir: created directory ‘/tmp/a2’ mkdir: created directory ‘/tmp/x_y’ mkdir: created directory ‘/tmp/x_z’ mkdir: created directory ‘/tmp/q_y’ mkdir: created directory ‘/tmp/q_z’ [root@node1 ~]#
三、文件元数据
- 文件的元数据有:File、Size、Blocks、IO Block、regular file、Device、Inode、Links、Access、Uid、Gid、Context、Access time、Modify time、Change time、Birth等信息
- stat命令可查看文件元数据信息
- touch命令可修改文件的时间戳
e.g.
-
查看anaconda-ks.cfg的元数据信息
[root@node1 ~]# stat anaconda-ks.cfg File: ‘anaconda-ks.cfg’ Size: 942 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 135128483 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2019-03-31 23:28:37.364000000 +0800 Modify: 2019-03-31 23:29:06.057000000 +0800 Change: 2019-03-31 23:29:06.057000000 +0800 Birth: - [root@node1 ~]#
-
修改文件的access time
[root@node1 ~]# touch -a anaconda-ks.cfg
-
修改文件的Modify time
[root@node1 ~]# touch -m anaconda-ks.cfg
四、命令引用
引用命令的执行结果
$(COMMAND)
COMMAND
e.g.
-
在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
[root@node1 ~]# touch tfile-$(date '+%F-%H-%M-%S')
五、globbing
文件名通配(整体文件名匹配,而非部分)
匹配模式:元字符
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
- 有几种特殊格式:
- [a-z], [A-Z], [0-9], [a-z0-9]
- [[:upper:]]:所有大写字母
- [[:lower:]]:所有小写字母
- [[:alpha:]]:所有字母
- [[:digit:]]:所有数字
- [[:alnum:]]:所有的字母和数字
- [[:space:]]:所有空白字符
- [[:punct:]]:所有标点符号
[^]:匹配指定范围外的任意单个字符
- [^[:upper:]]
- [^0-9]
- [^[:alnum:]]
e.g.
-
复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
[root@node1 ~]# mkdir /tmp/mytest1 [root@node1 ~]# cp -r /etc/p*[^0-9] /tmp/mytest1 [root@node1 ~]# tree -L 1 /tmp/mytest1 /tmp/mytest1 ├── pam.d ├── passwd ├── passwd- ├── pki ├── plymouth ├── pm ├── popt.d ├── postfix ├── ppp ├── prelink.conf.d ├── printcap ├── profile ├── profile.d ├── protocols └── python 10 directories, 5 files [root@node1 ~]#
六、用户和组管理
创建组:groupadd
groupadd - create a new group
groupadd [options] group
option:
- -g GID:指定GID;默认是上一个组的GID+1;
- -r: 创建系统组;
e.g.
-
创建jack组
[root@node1 ~]# groupadd jack
修改组:groupmod
groupmod - modify a group definition on the system
groupmod [options] GROUP
option:
- -g GID:修改GID;
- -n new_name:修改组名;
e.g.
-
将jack组的GID设置为5010,并将jack更名为jacker
[root@node1 ~]# groupmod -g 5010 -n jacker jack
删除组:groupdel
groupdel - delete a group
groupdel [options] GROUP
e.g.
-
删除jacker组
[root@node1 ~]# groupdel jacker
用户创建:useradd
useradd - create a new user or update default new user information
useradd [options] LOGIN
option:
- -c, --comment COMMENT:注释信息;
- -d, --home-dir HOME_DIR:用户家目录;
- -D, --defaults:创建用户的一些属性信息;
- -e, --expiredate EXPIRE_DATE:过期时间;
- -f, --inactive INACTIVE:非活动时间;
- -g, --gid GROUP:基本组,组得预先存在;
- -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:附加组,用逗号分隔;
- -k, --skel SKEL_DIR:从指定的目录复制初始配置文件;
- -m, --create-home:创建家目录;
- -M, --no-create-home:不创建家目录;
- -r, --system:系统用户;
- -s, --shell SHELL:用户默认shell;
- -u, --uid UID:指定UID;
e.g.
-
创建用户tom,指定UID为5001,指定家目录为/tmp/tom, 指定shell为/bin/zsh,指定基本组为tom,附加组为jack
[root@node1 ~]# useradd -u 5001 -d /tmp/tom -s /bin/zsh -G jack tom
修改用户属性:usermode
usermod - modify a user account
usermod [options] LOGIN
option:
- -u, --uid UID:修改用户的ID为此处指定的新UID;
- -g, --gid GROUP:修改用户所属的基本组;
- -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖;
- -a, --append:与-G一同使用,用于为用户追加新的附加组;
- -c, --comment COMMENT:修改注释信息;
- -d, --home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置;
- -m, --move-home:只能与-d选项一同使用,用于将原来的家目录移动为新的家目录;
- -l, --login NEW_LOGIN:修改用户名;
- -s, --shell SHELL:修改用户的默认shell;
- -e, --expiredate EXPIRE_DATE:修改过期时间;
- -f, --inactive INACTIVE:修改非活动时间;
- -L, --lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!";
- -U, --unlock:解锁用户的密码;
e.g.
-
修改用户tom的UID为5002,登录名为jack,shell为/bin/bash
[root@node1 ~]# usermod -u 5002 -s /bin/bash -l jack tom
删除用户:userdel
userdel - delete a user account and related files
userdel [options] LOGIN
option:
- -r, --remove:删除用户时将家目录、邮箱也删除
e.g.
-
删除jack用户并将家目录、邮箱也删除
[root@node1 ~]# userdel -r jack
切换用户:su
su - run a command with substitute user and group ID
su [options...] [-] [user [args...]]
option:
- -, -l, --login:切换至指定用户;
- -c command, --command=command:以指定用户的身份执行command命令;
e.g.
-
仅以zsjshao用户的身份执行whoami命令;
[root@node1 ~]# su - zsjshao -c 'whoami' zsjshao [root@node1 ~]#
-
切换到zsjshao用户,并执行whoami命令
[root@node1 ~]# su - zsjshao -c 'whoami' zsjshao [root@node1 ~]# su - zsjshao Last login: Mon Apr 1 00:28:07 CST 2019 on pts/0 [zsjshao@node1 ~]$ whoami zsjshao [zsjshao@node1 ~]$
查看用户id:id
id - print real and effective user and group IDs
id [OPTION]... [USER]
option:
- -u: 仅显示有效的UID;
- -g: 仅显示用户的基本组ID;
- -G:仅显示用户所属的所有组的ID;
- -n: 显示名字而非ID;
e.g.
-
查看root用户的uid
[root@node1 ~]# id -u root 0 [root@node1 ~]#
修改用户密码:passwd
passwd - update user's authentication tokens
passwd [option] [username]
option:
- -l, -u:锁定和解锁用户;
- -d:清除用户密码串;
- -e DATE: 过期期限,日期;
- -i DAYS:非活动期限;
- -n DAYS:密码的最短使用期限;
- -x DAYS:密码的最长使用期限;
- -w DAYS:警告期限;
- --stdin:从标准输入(管道)获取新密码;
e.g.
-
使用echo命令给passwd命令传递密码zsjshao用来修改root用户的密码
[root@node1 ~]# echo "zsjshao" | passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.