记录一下几天前学习的Linux文件和目录操作的知识。
先上几个简单的:
cd: 切换目录
pwd:显示当前目录的路径,-p参数用于显示当前的路径,而不是显示连接路径
mkdir:新建一个新的目录。
rmdir:删除一个空的目录。
其中,mkdir每次只能创建一级目录。比如:mkdir test 将会创建一个test目录。如果想要创建多级目录,类似与dir1/dir2/dir3,就必须加上-p参数,如下:
# mkdir -p dir1/dir2/dir3
创建目录的同时还可以加上 -m 参数来指定目录的权限(关于权限以后会有详细讲解)。
# mkdir -m 711 test
# ls -l
drwx--x--x 2 root root 4096 9月 27 10:32 test
关于rmdir也差不多,每次只能删除一级目录且该目录必须为空。要删除多级目录就要加上参数 -p。如果要删除目录和目录里面所有的东西(包括文件),那么可以采用 rm -r <目录名称>。
查看文件与目录的命令:
ls:用于查看文件或目录的详细信息。
几个常用的参数说明:
-a : 显示目录下全部的文件
-d : 只查看目录本身,而无需列举出目录内的文件数据。
-h : 将文件的容量用GB,MB,KB等方式列出(方便理解)。
-i : 列出inode号码。
-l : 列出文件的属性和权限信息。
--time=<值> : 输出相应的时间。如果值等于atime,输出该文件上一次被访问的时间,如果值等于ctime,输出该文件上一次权限被修改的时间。
--full-time : 以年、月、日、时、分的格式输出时间。
复制文件的命令:
cp: 复制文件
用法:cp source(源文件) destination(目标文件)//将source复制到destination里面
相关参数:
-p: 连同权限的属性一起复制过去。
-s: 生成一个文件,使得该文件是源文件的快捷方式。
删除文件的命令:
rm: 删除文件
用法: rm source(被删除的文件名)
相关参数:
-r: 如果被删除的目录中有文件,那么一并删除该目录和里面的文件。如果不加上-r参数,那么rm只能删除单一文件或空目录。
移动文件的命令:
mv: 移动文件
用法: mv source (源文件) destination (目的地)
相关参数:
-u: 若目的地文件已经存在,且源文件较新,才会移动并覆盖目的地文件。
-i: 若目的地文件已经存在,就会询问是否覆盖目的地文件。
获取文件的完整名字:
basename: 获取完整名字
用法:basename path (获取路径下的文件名称)
示例:
# basename /bin/mv
mv
获取文件的目录名称:
dirname:
用法: 和basename类似。
示例:
# dirname /bin/mv
/bin
文件内容查询命令:
cat:
用法: cat 文件路径
相关参数:
-n:打印行号。
tac:
用法: 类似与cat,只不过将文件内容反向输出。
more:
用法: 类似与cat。但是不会一口气将文件内容在屏幕上输出,而是一页一页的查看。
相关操作
Enter: 查看下一行。
Space空格键: 查看下一页。
less: 类似与cat,效果和more一样,不过可以通过page down和page up向下或者向下翻页。
相关操作:
page Down: 向下翻页。
page Up: 向上翻页。
head:
用法: 类似与cat,但是只会取出前n行数据,具体的n又参数制定。
参数:
-n <数字>: 代表去取前n行数据。
tail:
用法: 同head,只不过取得是文件末尾n行数据。
od:
用法: 以特定的方式来读取文件,方式是 cd [-t TYPE] 文件路径,具体看下面。
相关参数:
-t: 以某种方式读取文件内容,-t后面也会接上参数,他有如下参数:
a: 默认字符来输出。
c: 利用ASCII来输出。
d[size]: 利用十进制输出,每个数字占用size个bytes。
o[size]: 利用八进制输出,其他同d。
f[size]: 摸底,其他同d。
x[size]: 利用十六进制输出,其他同d。
修改/创建文件命令touch
先介绍和文件相关的几个时间概念:
modification time (mtime):当文件内容改变时,mtime会被修改成文件内容变动时的时间。
status time (ctime):当文件的权限和属性变动时,ctime会被修改成属性变动的时间。
access time (atime):当文件被人访问时,atime会被修改成别人当时访问的时间。
touch使用的格式: touch [参数] 文件名。
具体如下
新建一个空文件:
# touch test
# ls -l test
-rw-r--r-- 1 root root 0 9月 29 19:28 test
/×此时test文件的三个时间就会更新为当前的时间×/
修改文件的时间
# touch -t 0710250213 test
# ll test; ll --time=atime test; ll --time=ctime test
-rw-rw-r-- 1 root root 0 10月 25 2007 test
-rw-rw-r-- 1 root root 0 10月 25 2007 test
-rw-rw-r-- 1 root root 0 9月 29 20:29 test
/*如果没有添加--time参数,则默认输出mtime*/
touch创建目录时默认的权限
先谈一谈 umask
在终端内输入如下语句,打印unmask的值。
# umask
0022
在分别打印文件所有者、组员、其他人的默认权限
# umask -S
u=rwx,g=rx,o=rx
做一下解释,当用户创建一个文件时,这个文件的权限时怎么确定的。
首先来看创建文件,文件默认没有可执行权限(x),只有(r)(w)权限,所以默认权限为-rw-rw-rw-,化成数字就是666。那么最终权限的确定就是由这个数字666减去umask的后三位,也就是022,得到644,变换成字符表示就这样的:-rw-r–r–。
再来看创建文件夹。由于(x)权限与是否可以进入此文件夹有关,所以文件夹的(x)权限默认开放,也就是drwxrwxrwx,化成数字777。然后777减去umask的后三位,得到755,也就是drwxr-xr-x。
所以说创建文件或者文件夹时的默认权限和unmask有关,修改默认的权限就是修改umask,修改方法如下:
# umask 044 //修改来unmask,然后来看看默认权限是否改变
# touch test
# mkdir test2
-rw--w--w- 1 root root 0 9月 29 21:14 test
drwx-wx-wx 2 root root 4096 9月 29 21:14 test1
(对于权限不理解的,可以看看我写的关于权限的文章。)
文件的隐藏属性
文件的隐藏属性主要时和文件安全相关系的,比如某些属性可以使得文件无法被删除,有些使得文件只能被添加数据等。
那么对这些隐藏属性进行操作的命令就是:
chattr:修改文件隐藏属性。
lsattr:列举出文件的隐藏属性。
举个例子:
# chattr +i test
这个命令使得test这个文件加上来不可被其他人修改、删除的属性。
再来一个:
# chattr -i test
这样就使得test文件剔除了i属性,也就是说test这个文件可以被其他人修改或删除了。
下面是相关的属性列表:
+:增加一个属性。
-:剔除一个属性。
a:让文件只能被添加数据,而不能被删除或修改数据,只有root能够设置该属性。
i:任何人都不能对该。文件做任何修改(添加、删除等)
其他的自行man。
查找可执行文件(.sh)的路径
which:查找某一个可执行文件的完整路径。它的原理时是搜索PATH路径下的后缀为(.sh)的文件。
参数:
-a:将可以找到的所有可执行命令路径全部列出。
示例:
# which ls
# /bin/ls
查找普通文件的路径
whereis:该命令用于查找一般的文件,查找的原理是利用数据库来查找数据,并没有查询整个磁盘。再说find命令,它才是通过整个磁盘来查询文件的。
所以说有的命令文件没有被加入PATH,但却被存储进数据库里面,所以whereis有时候会找到which找不到的文件。
参数:
-b:只找二进制的文件。
-m:找到man文件路径下的文件。
-s:只找source源文件。
-u:查找不是上面三个选项的其他特殊文件。
locate:locate是这样用的,只要文件名/路径名包含你要查找的字符串,那么就会将文件名/路径名显示出来。(locate也是通过查询数据库来输出结果)
参数:
-i:忽略大小写的差异。
-r:在后面介入正则表达式。
示例:
# locate ls
# .......
//包含ls字符串的文件名/路径名太多,所以用...代替
find:直接在整个磁盘搜索相关文件名。
有好几种用法,且听我一一道来。
用法1:将路径下所有符合时间条件的文件全部列出来。
find <在什么路径下搜索> <按照什么条件搜索> <搜索条件的取值>
相关搜索条件:<按照什么条件搜索> <搜索条件的取值>
-mtime +n:搜索在n天之前(不包含第n天)修改过的文件。
-mtime n:搜索在n天之前的一天之内被更改的文件。
-mtime -n:搜索在n天之内(包含n天)被更改过的文件。
-newer file :file是一个文件,这个条件的含义是搜索比这个file更加新的文件。
用法2:将路径下所有符合文件所有者、所有组和其他*限的文件列出来。
find <在什么路径下搜索> <搜索条件> <搜索条件的取值>
相关搜索条件:
-uid n:n代表用户帐号的ID,只要文件的所有者的id是这个n,则列出这个文件。
-gid n:n代表用户组的ID,只要文件的所有组的id是这个n,则列出这个文件。
-user name:那么是用户的名字,只要文件所有者是这个名字,则列出这个文件。
-group name:同上,这不过这个name是文件所有组的名字。
-nouser:列出文件所有者不存在的文件。
-nogroup:列出所有文件所有组不存在的文件。
用法3:将路径下符合指定的文件名、文件类型、文件权限的的文件列出来。
-name filename:列出符合文件名是filename的文件。
-size +size:列出文件大小大于size的文件。
-size -size:类出文件大小小于size的文件。
这个size有几个单位:
c:代表byte。
k:代表KB
所以1000k代表的是1MB。
-type type:类出文件类型是type的文件。具体的type有如下几个:
f:一般文件。
b,c:设备文件。
d:目录。
l:连接文件。
s:socket文件。
p:FIFO文件。
-perm mode:列出文件权限是mode的文件。这个mode是一个数字,其余的可以参考Linux文件的权限。
-perm -mode:只要文件的权限包含了mode所指示的权限,则列出它。
-perm +mode:只要文件的权限包含了mode所指示的权限中任意一个,则列出这个文件。
用法4:可以在find的前三种用法的基础上,在末尾添加而外的处理命令。
参数:
-exec COMMAND命令:对find查找的结果用COMMAND命令进行额外的处理。
用例:
# find / -mtime +4 -exec ls -al {} \;
//对find查找出来的结果进行ls -al命令的处理。
-exec命令的具体说明:
其实-exec的具体格式是这样的-exec COMMAND {} ;
1.其中{}存放着find命令找出来的结果,所以COMMAND {}的含义是对find命令找出来的结果执行COMMAND命令。
2.那么“-exec”和“;”分别代表着分割符号,-exec是起始符号,“;”代表结束符号,那么位于这两者之间的就是需要执行的额外命令。
3.“;”是命令的分割符号,有它自己特殊的意义,所以在这个地方要进行字符的转义,于是用“\;”代替“;”。