学习笔记,内容基础,适合初学者。
阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)
《Unix & Linux 大学教程》 - 第一、二章 学习笔记 Unix简介 & 什么是Linux?什么是Unix
第二十五章:文件操作
自动创建文件的情况:
1.很多程序,当需要时会自动创建
2.将输出重定向到文件
3.复制文件
4.touch
touch
语法:
touch [-acm] [-t time] file...
作用:不改变文件的情况下,改变文件修改时间和访问时间
time是时间和日期,格式为[[YY]YY]MMDDhhmm[.ss]
默认情况下,touch将修改时间和访问时间设置为当前的时间和日期
ll
total 28
drwxrwxrwx 2 su1216 su1216 4096 2012-09-14 20:42 ./
drwxr-xr-x 17 su1216 su1216 4096 2012-10-25 16:10 ../
-rwxrwxrwx 1 su1216 su1216 20 2012-09-14 16:44 age*
-rwxrwxrwx 1 su1216 su1216 12 2012-09-14 16:43 name*
touch *;ll
total 28
drwxrwxrwx 2 su1216 su1216 4096 2012-09-14 20:42 ./
drwxr-xr-x 17 su1216 su1216 4096 2012-10-25 16:10 ../
-rwxrwxrwx 1 su1216 su1216 20 2012-10-29 11:36 age*
-rwxrwxrwx 1 su1216 su1216 12 2012-10-29 11:36 name*
-m:只改变修改时间
-a:只改变访问时间
-t:设置具体时间和日期
-c:不创建新文件
touch -m -t 201212210000 age;ll age(把age文件修改时间改为世界末日那天……)
-rwxrwxrwx 1 su1216 su1216 20 2012-12-21 00:00 age*
touch -c file1 file2(如果文件不存在,则不创建)
文件命名
1.最长为255个字符(最大长度由文件系统设置)
2.可以包含除了/(斜线)和null字符之外的任何字符
最好不要使用特殊字符
最好不要使用test作为文件名,shell拥有一个名为test的内置命令
大写字母留给重要的文件
复制文件
cp
语法:
cp [-ip] file1 file2
-i(interactive,交互):cp在替换已有文件时进行询问
-p(preserve,保持):目标文件和源文件拥有相同的
cp [-ip] file... directory
作用:将文件复制到指定目录
cp -r [-ip] directory1... directory2
作用:将目录复制到指定目录
移动文件
mv
语法:
mv [-if] file... directory
-i(interactive,交互):cp在替换已有文件时进行询问
-f(force,强制):与-i相反,强制替换
重命名文件或目录
mv
语法:
mv [-if] oldname newname
mv directory1 directory2(如果directory2不存在,则重命名directory1为directory2;如果directory2存在,则合并directory1到directory2中)
删除文件
rm
语法:
rm [-fir] file...
-i(interactive,交互):删除前进行询问
-f(force,强制):与-i相反,忽略文件权限和-i选项(某些系统上)
-r(recursive,递归):删除整个目录树
************************************
注意:
rm -fr $HOME/$FILE
如果上面两个变量都没有定义,那么该命令则变为
rm -rf /
************************************
文件权限
普通文件 | ||||||
|
||||||
目录 | ||||||
|
每个文件有三组权限:一组针对属主;一组针对组;一组针对其他用户
setuid用来允许普通用户表示运行从root拥有的程序中挑选的程序。这意味着无论哪个用户标识运行程序,它都以root特权运行
Unix维护文件权限的方式:id、groups
属主:创建文件的用户标识就是文件
属主是可以改变文件权限的唯一用户标识,第一组文件权限描述属主如何访问文件
每个用户都属于一个组,第二组权限应用于和属主位于同一组的所有其他用户标识
第三组权限应用于系统上的其他人以及剩下的每个人单独分配读、写和执行权限
查看用户所在组
id(显示当前用户信息)
uid=1000(su1216) gid=1000(su1216) groups=1000(su1216),4(adm),20(dialout),24(cdrom),46(plugdev),111(lpadmin),119(admin),122(sambashare)
groups username
显示文件权限
ls -l
-rwxrwxrwx 1 su1216 su1216 2547 2012-10-29 16:36 setup.py
上面的信息分别对应为:
文件权限 链接数量 用户标识 属主的组 大小 日期 上次修改时间 文件名称
其中最左边十个字符分为4个部分
第一个代表类型(文件夹为d,文件为-)
第2-4个表示文件属主的权限
第5-7个表示组的权限
第8-10个表示系统上所有其他用户标识的权限
文件模式:
4=读权限
2=写权限
1=执行权限
0=没有权限
读 | 写 | 执行 | 分量 | 和 |
- | - | - | 0+0+0 | 0 |
- | - | 有 | 0+0+1 | 1 |
- | 有 | - | 0+2+0 | 2 |
- | 有 | 有 | 0+1+2 | 3 |
有 | - | - | 4+0+0 | 4 |
有 | - | 有 | 4+0+1 | 5 |
有 | 有 | - | 4+2+0 | 6 |
有 | 有 | 有 | 4+2+1 | 7 |
改变文件权限
chmod
语法:
chmod mode file...
只有属主和超级用户才可以改变文件的文件模式
为新文件指定权限的方式
umask用户掩码(user mask)
语法:
umask [mode]
Unix创建新文件时,将根据文件的类型为文件指定下述几种模式:
666:不可执行的普通文件
777:可执行的普通文件
777:目录
在这模式基础上,Unix再减去用户掩码(user mask)值。
除非有有很好的理由,否则应该将umask 077放入登录文件中
清空文件内容
shred
语法:
shred -fvuz [file...]
-v(verbose,详细):处理过程中显示处理消息
-z:结束任务时将文件全部填充为0
-u:处理之后删除文件
f(force,强制):忽略受限文件
作用:多次覆盖硬盘上已有的数据,使得难以恢复
链接
Unix创建文件时会做两件事情
1.Unix在存储设备上保留一块空间用来存储数据
2.Unix创建一个称为索引节点(index node)或i节点(i-node)的结构,来存放文件的基本信息
i节点内容
stat
语法:
stat filename
作用:查看文件的i节点内容(各个文件系统之间i节点的准确内容可能有所不同)
文件系统将所有的i节点存放在一个大表中,称为i节点表(mode table)
i节点表中,每个i节点由所谓的索引号(index number)或i节点号(i-number)表示
目录不包含文件本身,只包含文件名称和其i节点号
文件名和i节点之间的连接称为链接
链接将文件名和文件本身连接起来(所以i节点不包含文件名,一个i节点可以由不只一个文件名引用)
多重链接
ln
语法:
ln file newname
file是一个已有普通文件的名称
newname是希望赋予链接的名称
语法:
ln file... directory
作用:为多个普通文件建立新链接,并将新链接放入指定目录
ln *txt linux_learned/
注意:这种方式不能为目录创建链接;不能为不同文件系统中的文件创建链接
此链接称为硬链接(hard link),简称为链接
基本文件命令的工作方式
1.创建文件,创建目录(mkdir)
Unix留出相应的存储空间并创建i节点,然后Unix在适当的目录中通过使用指定的文件名或目录以及新i节点号置入一个新条目
2.复制文件(cp)
复制已有文件时(覆盖),Unix用源文件的内容替换已有内容,但是i节点号并不进行修改。
复制不存在的文件时(复制),Unix首先用新文件自己的i节点号创建一个全新的文件,然后将旧文件的内容复制到新文件中。旧文件名对应于旧的i节点号,新文件名对应新的i节点号
3.重命名文件或移动文件(mv)
Unix改变文件名,或者移动目录条目,或者两者都进行,但是保持相同的i节点号
4.创建链接(ln)
Unix使用指定的文件名创建一个新的目录条目,并指向原始文件的i节点号
5.移除链接(rm、rmdir)
Unix通过移除目录条目,消除文件名和i节点号之间的连接,如果文件已经没有链接,Unix会删除该文件
符号链接(symbol link、symlink) (软链接,soft link)
语法:
Usage: ln -s(symbolic)... [-T] TARGET LINK_NAME (1st form)
or: ln -s(symbolic)... TARGET (2nd form)
or: ln -s(symbolic)... TARGET... DIRECTORY (3rd form)
or: ln -s(symbolic)... -t DIRECTORY TARGET... (4th form)
In the 1st form, create a link to TARGET with the name LINK_NAME.
In the 2nd form, create a link to TARGET in the current directory.
In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
Create hard links by default, symbolic links with --symbolic.
When creating hard links, each TARGET must exist. Symbolic links
can hold arbitrary text; if later resolved, a relative link is
interpreted in relation to its parent directory.
ls -l显示的链接数量为硬链接数量,没有办法显示软链接数量
如果某一文件存在符号链接,那么删除这个文件时符号链接不会被删除,如果试图使用该链接,则会显示错误信息
ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2012-02-02 11:30 /bin/sh -> dash
查看文件本身长列表则必须指定文件实际名称
ls -l /bin/dash
-rwxr-xr-x 1 root root 105704 2010-06-25 04:02 /bin/dash
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目录使用符号链接
当目录使用符号链接时,cd和pwd命令可以有两种作用:
1.命令可以将符号链接视为一个实体,即实际目录的一个同义词,更像普通文件的硬链接
2.链接只不过是真实目录的一个跳板
cd、pwd
-L(logical,逻辑):将符号链接视为真实的目录
-P(physical,物理):用真实目录替换符号链接
查找与Unix命令相关的文件
whereis
语法:
whereis [-bms] command...
-b(binary,二进制):只显示可执行文件的路径名
-m:只显示联机手册中章节
-s:只显示源文件路径
通过搜索数据库查看文件
locate
语法:
locate [-bcirS] pattern...
-r:启用正则
-i:忽略大小写
-c(count,总计):显示匹配文件的总数
-b:匹配路径名的最后一部分,基名
-S(statistics,统计):显示系统上locate数据库信息
注意:locate是在一个特殊的数据库中查找(该数据库中包含所有可公共访问的文件的路径名),该数据库自动维护并定期更新
当有新文件创建时,它并不会立即出现在数据库中,直至下一次更新
通过搜索目树查找文件
find
语法:
find path... test... action...
1.路径
2.检测(书上翻译为测试,感觉不通顺阿!):对遇到的每个文件,find应用指定的检测条件
3.动作:搜索完成后,find对结果的每个文件执行的操作
下面为重要的检测选项
文件名 | ||||||||||||||||||
|
||||||||||||||||||
文件特征 | ||||||||||||||||||
|
||||||||||||||||||
访问时间、修改时间 | ||||||||||||||||||
|
在检测条件前使用“!”运算符可以对检测求反
下面是对比结果
$ find -name "*.txt"
./address.txt
./email Notes.txt
./so.txt
./test.txt
$ find '!' -name "*.txt"
.
./txt2
./name
./txt1
./todo
./age
$ ls
address.txt age email Notes.txt name so.txt test.txt todo txt1 txt2
查找中可能会遇到没有权限的清空,下面命令可不显示此信息
find . -type d -name bin -print 2> /dev/null
下面为重要的动作选项
动作 | ||||||||||||||
|
-exec command {} \;
-exec将搜索输出发送给相应程序
command可以是任何命令,包括选项和参数
{}表示find查找到的路径名
为了表明路径的末尾必须以;(分号)结束命令(这里必须被引用)
find也支持正则,但是针对文件的全路径
手册中给出了一个例子
to match a file named `./fubar3', you can use the regular expression `.*bar.' or `.*b.*3', but not `f.*r3'
相当于默认加上了^(脱字符)和$
$ find -regex './a.*'
./address.txt
./age
处理查找到的文件
xargs
语法:
xargs [-prt] [-i string] [command [argment...]]
command是命令名称
string是占位符
argment是从标准输入读取的参数
注意:默认情况下,xargs运行指定命令至少一次
find -type f | xargs echo
./txt2 ./name ./address.txt ./email Notes.txt ./so.txt ./txt1 ./todo ./test.txt ./age
下面是书中的一个例子
find -type f | xargs echo | wc -w(用来统计当前目录下有多少文件)
其实我不是很明白
首先,为什么要用echo,直接使用find -type f | wc -w不是更好
其次,这条命令并不能准确的统计出文件个数,如果你文件名中有空格,那么统计就会出错
我觉得使用下面的命令比较合适
find -type f | wc -l
-i(insert,插入):允许使用{}做占位符,占位符在命令运行之前被参数取代
使用 -i 的时候,不要把其他选项和i连起来,否则会作为占位符处理
find -type f | xargs -i echo {} {}
./txt2 ./txt2
./name ./name
./address.txt ./address.txt
./email Notes.txt ./email Notes.txt
./so.txt ./so.txt
./txt1 ./txt1
./todo ./todo
./test.txt ./test.txt
./age ./age
ps:-i已经过时了(我的版本为xargs (GNU findutils) 4.4.2),应该使用-I。下面是手册中的说明
使用 -I 的时候,占位符不能省略
-p:执行新命令的时候进行许可提示
find -name '[abcde].junk' | xargs -i -p echo {}
即使是echo,也是会给出提示需要确认的
-t:显示生成了哪些命令(如果设置了-p就不用设置此项了,因为提示的时候就会看到)
find -name '[abcde].junk' | xargs -i -t echo {}
echo ./a.junk
./a.junk
echo ./e.junk
./e.junk
echo ./d.junk
./d.junk
echo ./b.junk
./b.junk
echo ./c.junk
./c.junk
-r:当xargs没有输入参数时,不运行命令(默认情况下,xargs运行指定命令至少一次)
$ find -empty | xargs -t ls -l
ls -l ./b ./a ./d ./e ./c
-rw------- 1 su1216 su1216 0 2012-10-31 16:01 ./a
-rw------- 1 su1216 su1216 0 2012-10-31 16:01 ./b
-rw------- 1 su1216 su1216 0 2012-10-31 16:01 ./c
-rw------- 1 su1216 su1216 0 2012-10-31 16:01 ./d
-rw------- 1 su1216 su1216 0 2012-10-31 16:01 ./e
(发现有5个空文件)
$ rm [abcde]*
(删除上面5个空文件)
$ find -empty | xargs ls -l
total 24
-rwxrwxrwx 1 su1216 su1216 12 2012-10-29 11:36 name
-rw-r--r-- 4 su1216 su1216 952 2012-10-12 15:22 so.txt
-rw-r--r-- 3 su1216 su1216 1979 2012-10-12 14:56 test.txt
(再次运行,发现还是执行了ls)
$ find -empty | xargs -r ls -l
(使用-r后,就不再执行)
xargs可以和任何程序一起使用,只要这些程序可以想xargs提供作为参数使用的字符串即可
$ (whoami; date) | xargs
su1216 2012年 10月 31日 星期三 16:13:57 CST
$ cat < so.txt | xargs > t.txt
(上面的例子书中不是这么写的,原文是:xargs cat < filenames > master,此命令无法执行,我也没看懂)
转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/