涉及 文件管理;标准I/O和管道;inode
ln 创建链接
-d 硬链接 相当于文件别名;多个名字 指向同一个inode
在选定位置新建一个文件名,显示文件大小与源文件相同,但并没有占用磁盘空间
只增加了极少量inode数据; A与B都指向硬盘数据block
-s 软连接 相当于快捷方式;可以跨分区创建;!最好用绝对路径创建
ls -s /SPATH(原始文件的绝对路径,或相对路径;相对于软链接DPATH路径) /DPATH
会在你选定的位置上生成一个文件,保存了路径信息; A指向B的路径
不论是硬链结或软链结都 不会将原本的文件数据复制一份,只会占用非常少量的磁盘空间。
硬链接数 = 名字数量
inode索引节点:储存文件 元信息的区域
每个inode都有一个号码,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。
当使用rm删除一个文件时,实际上是删除了 指向该文件硬盘数据块的inode信息
目录(directory)也是一种文件;一个目录是 目录下的文件名和 文件inode号之间的映射
inode包含文件的元信息: 可用 stat FILENAME 查看
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:
ctime指inode上一次变动的时间;
mtime指文件内容上一次变动的时间;
atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
df -i查看每个硬盘分区的inode总数和已经使用的数量
ll -i 查看文件|目录节点号
dumpe2fs -h /dev/sda# | grep "Inode size" 查看每个inode节点大小 #为硬盘分区号
注意:
1. 不同分区 的文件可以出现 相同的节点号,每个分区有独立的inode信息
2. 有时,文件名包含特殊字符,无法正常删除。
这时,利用find直接删除inode节点,就能起到删除文件的作用。
例 find ./PATH -inum INODENUM -exec rm -i {} \;
3. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
4. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
因此通常来说,系统无法从inode号码得知文件名。
***程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor(文件描述符)
/proc/pid/fd 进程所打开的所有文件
Linux给程序提供三种I/O设备
标准输入(STDIN)-0默认接受来自键盘的输入
标准输出(STDOUT)-1默认输出到当前终端窗口
标准错误(STDERR)-2默认输出到终端窗口错误信息
I/O重定向:改变默认位置 ls > /dev/pts/0 重定向到另一个终端窗口
STDOUT和STDERR可以被重定向到文件:
命令 操作符号 文件名
操作符号:
> 把STDOUT 重定向到文件[1]>
2>把STDERR 重定向到文件只会重定向错误的信息
&>把所有输出重定向到文件
例 ls /testdir /xxx >r 2>e 把标准输出 和标准错误 分别存放;
可能出现的 既有标准输出也有标准错误情况
*> 重定向到已存在的文件,内容会覆盖该文件
2>: 覆盖重定向错误输出数据流;
&>:覆盖重定向所有输出
例#cat > filea
zhou
将用户输入信息保存至文件
按ctrl+d离开
*>> 原有内容基础上,追加内容
2>>: 追加重定向错误输出数据流;
&>>:追加重定向所有输出
*< 重定向标准输入
tr‘a-z’‘A-Z’
使用文件来代替键盘的输入
Cat > filea < fileb
将fileb内容覆盖重定向至filea
*使用“<<终止词”命令从键盘把多行重导向给STDIN 就地文本
知道终止词位置前的所有信息追加至STDIN
终止词通常为EOF,可自定义,结束时必须为单独一行纯粹终止词
# set -C: 禁止将内容覆盖已有文件,但可追加>>
强制覆盖:>| 删除重建
# set +C: 允许覆盖
1.标准输出和错误输出各自定向 至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
2.合并 标准输出和 错误输出 至同一个文件:
COMMAND > /path/to/file.out2> &1
COMMAND >> /path/to/file.out2>> &1
2>&1 把输出信息中的 2标准错误 转化为 1标准输出
3.不显示错误信息 /dev/null接收所有数据
find/etc-namepasswd2>/dev/null
4.():合并多个程序的STDOUT
(pwd;ls)>/testdir/aa.log
(cal2007;cal2008)> all.txt
*tr[OPTION]... SET1 [SET2](translate) 转换和删除字符
-c或--complerment: 取 输入 的补集
-d或--delete: 删除 输入字符里的 SET1;
-s或-squeeze-repeats: 合并多个连续重复字符
-t或--truncate-set1: 先删除第一字符集较第二字符集多出的字符
例tr 'abcd' 'xyz' abcde xyzze !
例tr -t 'abcd' 'xyz' abcde xyzde !
*|管道
将管道前命令的SDOUT 发送给管道后命令的STDIN
STDERR默认不能通过管道转发,可利用2>&1 或|& 实现
最后一个命令会在当前shell进程的子shell进程
*tee可以同时将输出信息 重定向至 管道|> 和标准输出(终端屏幕)
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
ls|tee>list.txt
练习:
5、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和
tr ' ' '+' 55 6、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格 echo 'xt.,l 1 jr#bcmn2 c*/fe3 uz4'|tr -d -c [[:digit:]" "] 1 2 3 4 7、将PATH变量每个目录显示在独立的一行 echo $PATH|tr ":" "\n" /usr/lib64/qt-3.3/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /root/bin 8、删除指定文件的空行 cat crontab |tr -s "\n" 9、将文件中每个单词(字母)显示在独立的一行,并无空行 cat crontab|tr -s " " "\n" 单词 10、创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为"Gentoo Distribution" useradd gentoo -G bin,root -s shell -c "Gentoo Distribution" 11、创建下面的用户、组和组成员关系 名字为admins 的组 groupadd admins 用户natasha,使用admins 作为附属组 useradd natasha -G admins 用户harry,也使用admins 作为附属组 useradd harry -G admins 用户sarah,不可交互登录系统,且不是admins 的成员,natasha,harry,sarah密码都是centos useradd sarah echo "centos"|passwd --stdin natasha echo "centos"|passwd --stdin natasha usermod -s /sbin/nologin sarah 或者usermod -L sarah 锁定不让登陆