涉及 文件管理;标准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 锁定不让登陆