文件管理

在Linux中有这么一条哲学思想

一切皆文件

在Linux中,所有在系统中存放的数据都会映射为文件。

文件系统与目录结构

文件系统

  • 文件和目录被组织成为一个倒树状
  • 从根目录开始,用“/”表示
  • 文件名称区分大小写
  • 隐藏文件用“ . ”表示
  • 路径分隔 “/”
  • 文件有两类数据
    元数据:metadata 数据:data
  • 文件系统分层结构 : LSB (Linux Standard Base)
  • 文件存放位置推荐遵循 FHS 协议

文件名规则

  • 文件名最长255个字节
  • 包括路径在内文件名称最长4095个字节
  • 蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文 件 灰色-->其他文件
  • 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用, 有些字符需要用引号来引用它们
  • 标准Linux文件系统(如ext4),文件名称大小写敏感

文件系统结构

  • /boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub) 都存放于此目录

  • /bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序

  • /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序

  • /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)

  • /lib64:专用于x86_64系统上的辅助共享库文件存放位置

  • /etc:配置文件目录

  • /home/USERNAME:普通用户家目录

  • /root:管理员的家目录

  • /media:便携式移动设备挂载点

  • /mnt:临时文件系统挂载点

  • /dev:设备文件及特殊文件存储位置

    b: block device,随机访问

    c: character device,线性访问

  • /opt:第三方应用程序的安装位置

  • /srv:系统上运行的服务用到的数据

  • /tmp:临时文件存储位置

还有两个特殊的目录

  • /proc: 用于输出内核与进程信息县官的虚拟文件系统
  • /sys: 当前系统上的硬件设备相关信息虚拟文件系统

文件类型

  • - 普通文件
  • d 目录文件
  • b 块设备
  • c 字符设备
  • l 符号链接文件
  • p 管道文件pipe
  • s 套接字文件socket

绝对路径和相对路径

  • 绝对路径 以正斜杠开始 完整的文件的位置路径 可用于任何想指定一个文件名的时候
  • 相对路径名 不以斜线开始 指定相对于当前工作目录或某目录的位置 可以作为一个简短的形式指定一个文件名
  • 基名:basename
  • 目录名:dirnam

文件相关命令

cd 命令

切换用户当前工作目录

补充说明

cd命令 用来切换工作目录至dirname。 其中dirName表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录)。另外,~也表示为home directory的意思,.则是表示目前所在的目录,..则表示目前目录位置的上一层目录。

语法

cd (选项) (参数) 选项

  • -p 如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录
  • -L 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录。
  • - 当仅实用"-"一个选项时,当前工作目录将被切换到环境变量"OLDPWD"所表示的目录。

实例 cd 进入用户主目录;
cd ~ 进入用户主目录;
cd - 返回进入此目录之前所在的目录;
cd .. 返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思);
cd ../.. 返回上两级目录;
cd !$ 把上个命令的参数作为cd参数使用。


ls 命令

说明

显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。

参数 :

  •   -a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)
  •   -l 除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出
  •   -r 将档案以相反次序显示(原定依英文字母次序)
  •   -t 将档案依建立时间之先后次序列出
  •   -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
  •   -F 在列出的档案名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
  •   -R 若目录下有档案,则以下之档案亦皆依序列出

  实例:

  • 列出目前工作目录下所有名称是 s 开头的档案,愈新的排愈后面 :   ls -ltr s*
  • 将 /bin 目录以下所有目录及档案详细资料列出 :
      ls -lR /bin
  • 列出目前工作目录下所有档案及目录;目录于名称后加 "/", 可执行档于名称后加 "*" :
      ls -AF

stat

  • 文件:metadata, data

三个时间戳:

access time 访问时间, atime 读取文件内容

modify time 修改时间, mtime,改变文件内容(数据)
change time 改变时间, ctime,元数据发生改变


文件通配符

  • *匹配零个或多个字符
  • ? 匹配任何单个字符
  • ~ 当前用户家目录
  • ~mage 用户mage家目录
  • ~+ 当前工作目录
  • ~- 前一个工作目录
  • [0-9] 匹配数字范围
  • [a-z]:字母
  • [A-Z]:字母
  • [wang] 匹配列表中的任何的一个字符
  • [^wang] 匹配列表中的所有字符以外的字符
  • [:digit:]:任意数字,相当于0-9
  • [:lower:]:任意小写字母
  • [:upper:]: 任意大写字母
  • [:alpha:]: 任意大小写字母
  • [:alnum:]:任意数字或字母
  • [:blank:]:水平空白字符
  • [:space:]:水平或垂直空白字符
  • [:punct:]:标点符号
  • [:print:]:可打印字符
  • [:cntrl:]:控制(非打印)字符
  • [:graph:]:图形字符
  • [:xdigit:]:十六进制字符

mkdir和touch

mkdir 创建目录

补充说明

创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录;如果给出了一个已经存在的路径,将会在该目录下创建一个指定的目录。在创建目录时,应保证新建的目录与它所在目录下的文件没有重名。
注意:在创建文件时,不要把所有的文件都存放在主目录中,可以创建子目录,通过它们来更有效地组织文件。最好采用前后一致的命名方式来区分文件和目录。例如,目录名可以以大写字母开头,这样,在目录列表中目录名就出现在前面。

语法 mkdir (选项)(参数)

选项

  • -Z:设置安全上下文,当使用SELinux时有效;
  • -m<目标属性>或--mode<目标属性>建立+ 目录的同时设置目录的权限;
  • -p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
  • --version 显示版本信息。
    参数
    目录:指定要创建的目录列表,多个目录之间用空格隔开。

touch

格式:touch [OPTION]... FILE...

  • -a 仅改变 atime和ctime
  • -m 仅改变 mtime和ctime
  • -t [[CC]YY]MMDDhhmm[.ss] ,指定atime和mtime的时间戳
  • -c 如果文件不存在,则不予创建

cp 命令 复制文件或目录

cp [options] source dest
cp [options] source... directory

参数:

  • -a 保留所有权限 相当于- dR
  •  -r 若 source 中含有目录名,则将目录下之档案亦皆依序拷贝至目的地。
  •   -f 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制。
  • -i 覆盖前提示
  • -n 不覆盖
  • -d 不复制源文件,只复制链接名
  • --backup=numbered 目标存在,覆盖前先备份加数字后缀

mv

mv [OPTION]... [-T] SOURCE DEST

mv [OPTION]... SOURCE... DIRECTORY

mv [OPTION]... -t DIRECTORY SOURCE...

 常用选项:  
   -i   交互式 
   -f   强制 
   -b  目标存在,覆盖前先备份  

rm 删除

rm [OPTION]... FILE...

常用选项:

  • -i 交互式
  • -f 强制删除
  • -r 递归
  • --no-preserve-root 删除/
    示例:
rm -rf /* (危险命令,切勿在生产环境中尝试,Enter前请三思 )

I/O重定向及管道

输入输出重定向及管道
程序: 指令+数据
	读入数据: Input
	输出数据: Output
打开的文件都有一个fd; file descriptor (文件描述符)
标准输入:keyborad(键盘)  0
标准输出:monitor(显示器) 1
标准错误输出:monitor 		 2

I/O重定向:改变标准位置

输出重定向: COMMAND > NEM_POS, COMMAND >> NEM_POS
	> 覆盖重定向,目标文件中的原有内容会被清除
	>> 追加重定向,新内容会追加至目标文件尾部
	# set -C : 禁止将内容覆盖输出至已有文件中
		强制覆盖: >|
	# set +C: 允许覆盖

	2>:覆盖重定向错误输出数据流
	2>>追加从定向错误输出数据流

	标准输出和错误输出各自定向至不同位置
		COMMAND > /PATH/TO/file.out 2> /path/ro/error.out

	合并标准输出和错误输出至同一个数据流进行从定向
		&> 覆盖重定向
		&>> 追加重定向

		COMMAND > /PATH/TO/file.out 2> &1
		COMMAND >> /PATH/TO/file.out 2>> &1

输入重定向: <

	tr命令:转换或删除字符
		tr [OPTION]... SET1 [SET2]
			-d 删除指定字符串
	HERE Documentation : <<  (此处生成文档) 
	Note:单行重定向 与 多行重定向
		#cat << EOF
		#cat >/path/ro/somefile <<EOF

管道: COMMAND | COMMAND | COMMAND | ...

Note:最后一个命令会在当前shell进程的子shell中执行的

tee命令:一路输入两路输出
	tee [option]... [file]....
	-a 追加

文件处理工具 wc cut sort uniq

wc [option] [file]...
	-l: 统计行数
	-c: 统计字节数
	-w;统计单词数

tr: 转换字符或删除字符
	tr '集合1' '集合2'
	tr -d '字符集合'
	tr -dc '字符合集' 除了双引号内的,都删除
	\n 换行
	\r 回车
	\t tab键
	\v 纵向tab键

cut: 
	This is a test line.
	-d字符:指定分隔符
	-f#: 指定要显示字段
		单个数字:一个字段
		逗号分隔的多个数字:指定多个离散字段
		-:连续字段,如3-5;

sort: 按字符进行比较
	sort [option] file...
		-f: 忽略字符大小写;
		-n: 比较数值大小;
		-t: 指定分隔符
		-k: 指定分隔后进行比较字段
		-u: 重复的行,只显示一次;

uniq: 移除重复的行
	-c:显示每行重复的次数
	-d:仅显示重复过的行
	-u: 仅显示不曾重复的行
总结:
1、
   小技巧:
    可以使用>>创建空文件,相对于来说,比较安全,防止文件存在覆盖数据,造成数据丢失

    set  仅在当前shell 有效
    单行从定向:	cat > file
    多行重定向:cat <<

    ls /erro /boot 2> file.out 2> erro.out
        相当于将错误的重定向如file.out中,正确的重定向至erro.out
    ls /error /boot > /file.out 2>&1 
        不管正确还是错误都重定向至file.out
    ls /error /boot 2>&1 > file.out中    将错误输出显示至屏幕,正确的重定向至fele.out
    (ls /error /boot 2>&1 ) > file.out 正确和错误都重定向
    ls /error /boot 2> file.out 1>&2    先将错误的重定向至file.out中,然后把正确的当做错误的重定向至同一个文件中
    # 以下四个命令中哪个是结果不一样
    1
    2
    3
    4

2、
    tr '[:lower:]' [:upper:]  把所有小写字母转换为大写字母
    ls [:lower:]* 代表 以l,o,w,e,r 其中任意一个字符开头的行
    ls [[:lower:]]* 代表 	所有以字母开头的行

用户组管理

资源分派

Authentication 认证
Authorizathin  授权 
Accouting	审计

token,identity(username/passwd)
linxu用户: Username/UID
管理员: root, 0
普通用户:1-65536(60000)
    系统用户 1-499 (centos6) 1-999(centos7)
        守护进程获取资源进行权限分配
    普通用户 500+

Linux的安全上下文:

运行中的程序,进程(process)

以进程发起者的身份运行:
    #root:cat 
    $tom:cat 
进程所能够访问的所有资源的权限取决于程序运行的发起者的身份

Linux组的类别

用户的基本组(主组):
    组名同用户组,且包含一个用户,私有组
用户的附加组(额外组):

Linux用户和组相关配置文件

  • /etc/passwd保存用户及其属性信息
  • /etc/group 组及其属性信息
  • /etc/shadow 用户密码及其相关属性
  • /etc/gshadow 组密码及其相关属性

/etc/passwd

name:passwd:UID:GID:GECOS:directory:shell
用户名:密码:UID:GID:GECOS:主目录:默认shell:

/etc/group

group_name:password:GID:user_list
组名:密码:组ID:用户列表(分隔符为逗号)

/etc/shadow

用户名:加密了的密码:最近一次更改密码的日期:密码的最小使用期限:密码的最大使用期限:账号警告时间段:密码禁用期:密码过期日期:保留字段

    加密机制:
        加密 明文-->密文
        解密 密文-->明文

        单向加密:提取数据指纹
            md5: message digest,128bits
            sha1: secure hash algorithm,160bits
            sha224:224bits
            sha256:256bits
            sha384:384bits
            sha512:512bits

            雪崩效应:初始的条件的微小改变,将会引起结果的巨大改变
            定长输出:

    密码的复杂性策略;
    1、使用数字,大写字母,小写字母及特殊字符中至少3中
    2、足够长:
    3、使用随机密码:
    4、定期更换:不要使用最近曾经使用过的密码

用户和组相关命令

用户创建: useradd

	SYNOPSIS
	       useradd [options] LOGIN
	       useradd -D
	       useradd -D [options]
	OPTION:
	      -u UID: [UID_MIN,UID_MAX] 定义在/etc/login.defs
	-g GID: 指明用户所属基本组,可为组名,也可以GID
	-c "comment" :用户注释信息 (等价于 chfn username)
	-d /path/tohome_dir: 以指定的路径为家目录
	-s SHELL : 指明用户的默认shell程序,可用列表在/etc/shells文件中 (等同 chsh -s )
	-G GROUP1[GROUP2,...[,GROUPN]]:为用户指明附加组,组必须事先存在
		-n  不为用户创建私有用户组
		
		-M : 不创建主目录
		-e date :指定账户过期时间,格式为:MM/DD/YY
		-f days : 帐号过期几日后永久停权。若指定为 -,则立即被停权,若为 -   1,则关闭此功能
		-r : 创建系统用户,默认不创建对应的主目录
		-p passwd : 为新建用户创建指定登录密码。(此项使用较少)
		
		

		默认值设定: /etc/default/useradd文件中
			useradd -D  \\ 修改默认值

修改用户属性:usermod

SYNOPSIS
       usermod [options] LOGIN
OPTION:
	-a: 将用户添加到补充组。仅与-G选项一起使用
	-c<备注>:修改用户帐号的备注文字;
	-d<登入目录>:修改用户登入时的目录;
	-e<有效期限>:修改帐号的有效期限;
	-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
	-g<群组>:修改用户所属的群组;
	-G<群组>;修改用户所属的附加群组;
	-l<帐号名称>:修改用户帐号名称;
	-L:锁定用户密码,使密码无效;
	-s<shell>:修改用户登入后所使用的shell;
	-u<uid>:修改用户ID;

    -r : 同时删除家目录

创建用户组: groupadd

	Groupadd  [-r]  groupname
	Option:
		-r:创建系统用户组,该类用户组的GID小于500或1000。

修改用户组属性: groupmod

	groupmod [options] GROUP
	Option
	   -n : 改变用户组名称 	groupmod -n 新用户组名  原用户组名
	-g:重新设置用户组GID	groupmod -g new_GID 用户组名称

删除用户组: groupdel

	注意:在删除用户组时,被删除的用户组不能某个用户的私有用户组,若要删除,则应先删除私有用户组的账户,然后再删除用户组
添加用户到指定组/从指定组移除用户: gpasswd
	用法:
		gpasswd  -a username group 将指定用户添加到指定组
		gpasswd  -d username group 从用户组中移除指定用户
设置用户组管理员
	gpasswd -A 用户账户 要管理的用户组           
	命令功能:将指定的用户设置为指定用户组的用户管理员。用户管理员只能对授权的用户组进行用户管理 (添加用户到组或从组中删除用户),无权对其他用户组进行管理。
设置账户登录密码: passwd
	passwd [用户]
	也可以通过标准输出来设置密码
		echo "字符串" | passwd --stdin  username
	
	
																																					------------不敢原创,总结了一些笔记