一、linux中的文件,及文件操作管理命令
1. 文件概念
存储空间存储的一段流式数据,对数据可以做到按名存取。
-
linux中的文件具有的特点是:可通过操作系统或者程序对外提供信息,也能对内输入信息,可以被创建,删除。linux中,文件有特别重要的意义,他们为操作系统和设备提供了一个简单而统一的接口。在linux中,几乎一切都可以看做是文件 。这就意味着,普通程序完全可以像使用文件(普通定义)那样使用磁盘文件、串行口、打印机和其他设备。
例如:可以把cdrom驱动器挂载为一个文件
~]# mount /dev/cdrom /media/cdrom/ 挂载光盘文件 ~]# cd /media/cdrom/ [root@localhost cdrom]# ls CentOS_BuildTag isolinux RPM-GPG-KEY-CentOS-Debug-6 EFI Packages RPM-GPG-KEY-CentOS-Security-6 EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6 GPL repodata TRANS.TBL images RPM-GPG-KEY-CentOS-6
注:上面这个例子证明硬件设备在linux中也被表示为文件
2、对文件的操作
-
操作一般意义上的文件一样,linux中对文件的操作只需要五个基本的函数:open(), read(), write(), close(), delete(), create();通过调用这几个函数就能对linux中的文件进行读、写等操作。不过,这种操作又分为系统调用和库函数调用。简单的说,系统调用是最直接的方式,库函数调用最终也是通过系统调用实现的。可认为库函数调用是对系统调出于效率考虑而做出的优化;我们用很少的函数就可以对文件和设备进行访问和控制。这些函数就是所谓的系统调用,由操作系统直接提供,他们是通向操作系统本身的接口。
操作系统的核心部分,既内核,其实就是一组设备驱动程序。这是一些对硬件进行控制的接口。
3、文件操作相关命令
-
cat命令 文件文本查看工具;
cat:concatenate files and print on the standard output 连接文件并在标准输出上打印 ~]# cat /etc/fstab ..... cat [OPTION]... [FILE]... -n:给显示的文本行编号; -E: 显示行结束符$; ~]# cat -n /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ~]# cat -E /etc/issue CentOS release 6.6 (Final)$ Kernel \r on an \m$ $
-
tac命令 文件文本查看工具;逆序显示
tac [OPTION]... [FILE]... -n:给显示的文本行编号; -E: 显示行结束符$;
-
head命令 查看文件的前n行;默认10行
head [options] FILE -n # 可以-3,也可 -n 3 默认不加选项 显示10行 -# ~]# head -n 3 /etc/fstab # # /etc/fstab
-
tail命令 查看文件的后n行;默认10行
tail [options] FILE -n # -# -f:查看文件尾部内容结束后不退出,跟随显示新增的行; ~]# tail -1 /etc/fstab proc /proc proc defaults 0 0 ~]# echo "second line" >> /tmp/functions ~]# tail -f /tmp/functions fi fi fi done < /etc/crypttab return $ret } # A sed expression to filter out the files that is_ignored_file recognizes __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d' new line second line 注意:-f 选项 后期监控日志增长的时候非常有用;
4.文件管理类命令
-
cp命令
源文件;目标文件; 单源复制:cp [OPTION]... [-T] SOURCE DEST 多源复制:cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... 单源复制:cp [OPTION]... [-T] SOURCE DEST 如果DEST不存在:则事先创建此文件,并复制源文件的数据流至DEST中; 如果DEST存在: 如果DEST是非目录文件:则覆盖目标文件; 如果DEST是目录文件:则先在DEST目录下创建一个与源文件同名的文件,并复制其数据流; 多源复制:cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... 如果DEST不存在:错误;目标必须是目录; 如果DEST存在: 如果DEST是非目录文件:错误; 如果DEST是目录文件:分别复制每个文件至目标目录中,并保持原名; -i:交互式复制,即覆盖之前提醒用户确认; -f:强制覆盖目标文件;如果目标文件不能被打开,则移除并覆盖之 -r, -R:递归复制目录;递归复制目录及目录中的内容; -d:复制符号链接文件本身,而非其指向的源文件; -a:-dR --preserve=all, archive,用于实现归档;理解为做备份 --preserv= mode:权限 ownership:属主和属组 timestamps: 时间戳 context:安全标签 xattr:扩展属性 links:符号链接 all:上述所有属性 -i 选项: ~]# alias alias cp='cp -i' 管理员root系统自动给定义了别名,而普通用户没有; ~]# cp /etc/fstab /tmp/ cp: overwrite `/tmp/fstab'? 交互式确认 -r,-R选项: ~]# cp -r /var/log /tmp/ 目标目录存在会在其下创建一个与原目录同名的目录到该目录下且该目录内容全部复制过去; ~]# ls /tmp/ fstab functions hello log moosefs mytest passwd.out skel -d选项: ~]# cp /etc/system-release /tmp/ 把这个符号链接指向的源文件真实数据给复制了 ~]# ls /tmp/ fstab functions hello skel system-release ~]# cat /tmp/system-release CentOS release 6.6 (Final) 不想让他把数据给复制过去,就使用-d选项; ~]# cp -d /etc/system-release /tmp/system.rel ~]# ls -l /tmp/ lrwxrwxrwx 1 root root 14 Dec 8 00:53 system.rel -> centos-release -rw-r--r-- 1 root root 27 Dec 8 00:49 system-release
-
mv命令 move
move (rename) files 移动或者重命名 源有多个,目标只能为目录 mv [OPTION]... [-T] SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY mv [OPTION]... -t DIRECTORY SOURCE.. -i :交互式覆盖 -f : 强制覆盖 tmp]# mv hello hello.txt 源文件与目标文件在同一个目录下,就改名 tmp]# ls fstab hello.txt moosefs passwd.out system.rel functions log mytest skel system-release tmp]# mv x tom 无需选项 tmp]# ll drwxr-xr-x 2 root root 4096 Dec 8 01:02 tom
-
rm命令remove
rm [OPTION]... FILE... 常用选项: -i:interactive 交互式 -f:force 强制 -r: recursive 递归 删除目录:rm -rf /PATH/TO/DIR 危险操作:rm -rf /* 红帽系统是ext系列的文件系统,反删除能力非常薄弱; 注意:所有不用的文件建议不要直接删除,而是移动至某个专用目录;(模拟回收站) 对于管理员来说,定义了别名,而普通用户没有; tmp]# rm hello.txt rm: remove regular empty file `hello.txt'? y,删除,n,或者不跟任何字符都不删除; tmp]# rm -r /tmp/log/ rm: descend into directory `/tmp/log'? y rm: remove regular file `/tmp/log/dmesg.old'? y rm: descend into directory `/tmp/log/sa' 当然使用# rm -fr /tmp/log
二、bash的工作特性之命令执行状态返回值和命令行展开
-
命令执行状态返回值
bash中一条命令的执行,会产生两种返回结果:命令结果及命令执行状态结果。一条命令成功执行,其执行状态返回值为0。如果未能成功执行,其返回值为1-255。 ~]# ls anaconda-ks.cfg A-Z install.log tee test.txt tree a-z fstab install.log.syslog test tr [root@localhost ~]# echo $? 0 ~]# llls -bash: llls: command not found [root@localhost ~]# echo $? 127
-
命令行展开
~:自动展开为用户的家目录,或指定的用户的家目录; ~]# cd ~ 进入当前登录账号的家目录, 默认 "cd" 命令就可以实现 ~]# cd ~loginname 进入指定用于的家目录 {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径; 例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b 问题1:如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b? ~]# mkdir -pv /tmp/x/{y1/{a,b},y2} 问题2:如何创建a_c, a_d, b_c, b_d; ~]# mkdir -v {a,b}_{c,d} 问题3:创建如下目录结构: /tmp/mysysroot/ |-- bin |-- etc | `-- sysconfig | `-- network-scripts |-- sbin |-- usr | |-- bin | |-- lib | |-- lib64 | |-- local | | |-- bin | | |-- etc | | |-- lib | | `-- sbin | `-- sbin `-- var |-- cache |-- log `-- run ~]# mkdir -pv /tmp/mysysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib},lib,lib64},var/{cache,log,run}}
三、文件的元数据状态查看,修改时间戳等操作
-
文件:每一个文件都有两类数据
元数据:metadata 快速检索内容的目录。理解为描述数据的属性 包括:大小,块数,类型,设备号;inode 号(索引节点号), 链接次数,硬链接;创建时间 数据: data 正文部分 数据一改变,元数据就会立即更新他的时间戳,意味着改动时间也立即跟新
-
stat命令 显示文件的状态
stat - display file or file system status 显示文件的状态 stat FILE... ~]# stat /tmp/functions File: '/tmp/functions' Size: 13966 Blocks: 32 IO Block: 4096 regular file Device: 803h/2051d Inode: 201326722 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:user_tmp_t:s0 时间戳: 最近访问:Access: 2016-11-14 14:19:50.622408377 +0800 读取文件内容;数据流 最近更改:Modify: 2016-11-14 14:18:14.173408906 +0800 新增一行,数据改变 最近改动:Change: 2016-11-14 14:18:14.173408906 +0800 元数据改变
-
touch命令:修改文件时间戳
change file timestamps 更改文件時間戳 -c:指定的文件路径不存在时后,不予创建; -a: 仅修改access time; 直接修改当下命令执行时的时间; -m:仅修改modify time; 注意:change time 不能手动指定更改 -t STAMP (指定要改为哪一刻时间) [[CC]YY]MMDDhhmm[.ss] 年月日 小时 分钟 秒 ~]# touch /tmp/functions 如果不跟指定时间,该文件立即跟新为当下系统时间,命令执行的时间 ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2016-12-07 23:42:06.003985658 +0800 Change: 2016-12-07 23:57:47.679988222 +0800 ~]# touch /tmp/hello 摸一个不存在的文件,就会创建一个文件 ~]# ls /tmp/ functions hello ~]# file /tmp/hello 看到这个是个空文件 /tmp/hello: empty ~]# touch -c /tmp/lessssss 不存在该路径不予创建 ~]# ls /tmp functions moosefs ~]# touch -m -t 0212010303.03 /tmp/functions ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2002-12-01 03:03:03.000000000 +0800 Change: 2016-12-08 00:13:13.438986294 +0800 数据一改变,元数据就会立即更新他的时间戳,意味着改动时间也立即跟新
四、别名的作用,以及如何在命令中引用其它命令的执行结果
-
alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误。
-
alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc或者/home/.bashrc(/root/.bashrc)中。
change file timestamps 更改文件時間戳 -c:指定的文件路径不存在时后,不予创建; -a: 仅修改access time; 直接修改当下命令执行时的时间; -m:仅修改modify time; 注意:change time 不能手动指定更改 -t STAMP (指定要改为哪一刻时间) [[CC]YY]MMDDhhmm[.ss] 年月日 小时 分钟 秒 ~]# touch /tmp/functions 如果不跟指定时间,该文件立即跟新为当下系统时间,命令执行的时间 ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2016-12-07 23:42:06.003985658 +0800 Change: 2016-12-07 23:57:47.679988222 +0800 ~]# touch /tmp/hello 摸一个不存在的文件,就会创建一个文件 ~]# ls /tmp/ functions hello ~]# file /tmp/hello 看到这个是个空文件 /tmp/hello: empty ~]# touch -c /tmp/lessssss 不存在该路径不予创建 ~]# ls /tmp functions moosefs ~]# touch -m -t 0212010303.03 /tmp/functions ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2002-12-01 03:03:03.000000000 +0800 Change: 2016-12-08 00:13:13.438986294 +0800 数据一改变,元数据就会立即更新他的时间戳,意味着改动时间也立即跟新
-
引用命令的执行结果:命令引用是引用命令的执行结果,状态结果靠$?
$(COMMAND) 或`COMMAND` ~]# date +%H-%M-%S 09-18-13 ~]# mkdir $(date +%H-%M-%S) 把$后的内容当做参数来引用; ~]# ls 09-19-39 a-z fstab bash的基于特性:引用 强引用:'' 内部任何字串直接显示,不做替换 弱引用:"" 会替换,变量中所存储的值; ~]# A=1 ~]# echo $A 1 ~]# echo '$A' $A ~]# echo "$A" 1 命令引用:``
五、其它练习题目
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录; ~]# ls -d /var/l?[[:lower:]] /var/lib /var/log 2、显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录; ~]# ls -d /etc/[0-9]*[^0-9] 3、显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录; ~]# ls -d /etc/[^a-z][a-z]* 4、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名型如:tfile-2016-05-27-09-32-22. ~]# touch /tmp/tfile-$(date +%F-%H-%M-%S) ~]# ls /tmp/ fstab hello.txt moosefs passwd.out system.rel tfile-2016-12-08-10-24-52 5、复制/etc目录下所有已p开头,以非数字结尾的文件或目录至/tmp/mytest1目录; ~]cp -r /etc/p*[^0-9] /tmp/mytest1/ ~]# cp -r /etc/p*[^0-9] /tmp/mytest1 cp: overwrite `/tmp/mytest1/passwd'? y cp: overwrite `/tmp/mytest1/passwd-'? y ~]# ls /tmp/mytest1 pam.d pinforc 6、复制/etc/目录下所有以.d结尾的文件或目录至/tmp/mytest2中。 ~]# cp -r /etc/*.d /tmp/mytest2 ~]# ls /tmp/mytest2 bash_completion.d init.d modprobe.d rc1.d rc.d xinetd.d chkconfig.d latrace.d pam.d rc2.d rsyslog.d yum.repos.d cron.d ld.so.conf.d popt.d rc3.d rwtab.d 7、复制/etc目录下所有已l或m或n开头,已.cont结尾的文件至/tmp/mytest3目录中。 ~]# cp -r /etc/[lmn]*.conf /tmp/mytest3 ~]# ls /tmp/mytest3 latrace.conf libaudit.conf logrotate.conf mke2fs.conf nsswitch.conf ld.so.conf libuser.conf ltrace.conf mtools.conf ntp.conf
原创文章,作者:让优秀称为一种习惯,如若转载,请注明出处:http://www.178linux.com/63257
评论列表(1条)
赞,总结的不错~加油~