linux 中一切皆文件,我们所做的一切都是和文件打交道,总结下常用的文件管理相关命令
文件分为两部分:元数据和数据
元数据: 即真实数据的属性。可用 stat 命令查看
stat [option]... FILE...
[[email protected] ~]# stat /etc/passwd
File: ‘/etc/passwd’
Size: 2302 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 10244448 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2016-06-18 19:52:01.243237019 -0400
Modify: 2016-04-23 09:47:20.643714195 -0400
Change: 2016-04-23 09:47:20.650714195 -0400
Birth: -
包括文件大小,所占的块数 ,所占块大小, 文件类型, 权限, 所属属主,属组,context值
文件访问时间,文件内容修改时间,文件改变的时间。
其中access,modify, change 为文件的时间戳,可以用touch 命令来修改
touch -a FILE 只是修改文件的atime
touch -m FILE 只是修改文件的mtime
注: 当atime或mtime 其中之一任意改变,ctime都会改变。
touch 命令同时还可以创建文件
用法:touch FILE
如果名字后面想跟上创建文件时的时间,可以引用date命令来实现。
e.g. 在/tmp目录下创建已tfile开头,后面接当前日期的文件,格式如tfile-2015-5-27-09-22-33
touch tfile-$(date +%F-%H-%M-%S)
当我们每次需要创建该类型的文件时,都得输入这么长的命令,为了方便,我们可以把上面那条命令定义一个别名,以后可以直接输入别名就可以达到该效果。
定义命令别名 tfile
当前shell生效 :alias tfile=‘touch tfile-$(date +%F-%H-%M-%S)’
如果对所有用户生效,可以编辑/etc/bashrc ,在最后一行加上如上命令。
当我们管理文件时,首先要知道自己所处的位置,然后开始工作
pwd : 显示当前的在哪个目录下,默认登录进系统,都处于登录用户的家目录下。
mkdir: 创建目录,目录也是文件。
用法 mkdir [option]... FILE...
rmdir: 只能删除空目录。一般删除目录和文件用rm命令。
列子:
1. 创建/tmp目录下的:a_c, a_d, b_c, b_d
解:touch /tmp/{a,b}_{c,d}
2. 创建/tmp/mylinux目录下的各级目录:
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └── network-scripts
├── lib
│ └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ └── local
│ ├── bin
│ └── sbin
└── var
├── lock
├── log
└── run
解: mkdir -p /tmp/mylinux/{bin,boot/grub/,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
当我们执行完命令后,我们可以查看命令执行状态返回值来查看命令是否成功。
echo $?
当值是0时,表示命令执行成功,
当值是1-255时,表示命令执行失败。
通配符与正则表达式
当我们需要查看目录中某些特定需求的文件时,此时就需要通过glob(通配符)或者正则表达式的帮助来完成。
我们可以通过几个列子来总结下。
例子:
1、显示/var目录下所有以1开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
解: ls -R /var | grep "^1.*[0-9].*[a-z]$"
2、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
解: ls -R /etc | grep "^[[:digit:]].*[^[:digit:]]$"
3、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
解: ls -R /etc/ | grep "^[^[:alpha:]][[:alpha:]].*" | grep -v "^\ /.*"
一般来说,如果是在一个目录下面查找特定需求的文件,只要用到通配符就好,但是上面题目中所要求要查找出所有的文件和目录,这里只能是用到正则表达式了,也许是有别的方法,以后再研究,这里总结下通配符和正则表达式。
通配符:即shell中为了实现文件名的匹配,查找类似的文件,即打牌中的赖子。
* : 匹配任意长度的任意字符。
? : 匹配任意一个字符。
[] : 匹配指定范围的一个字符。
[^] : 匹配范围外的字符。
专用的字符合集:
[:alnum:] : 数字或字母
[:alpha:] : 字母
[:digit:] : 数字
[:lower:] : 小写字母
[:graph:] : 除了空格和控制字符外的所有字符
[:punct:] : 标点符号
[:upper:] : 大写字母
正则表达式主要是对文本的匹配,像上面的几道题都是先显示出来目录下的所有文件,相当于把结果放到了一个文本中,再通过正则表达式来匹配结果。
字符匹配: . 表示任意单个字符 ; [] [^] 字符合集与通配符一样。
次数匹配:
* 匹配前面的字符任意次数 .* 表示任意长度的任意字符
\? 匹配前面字符0次或1次
\+ 匹配前面字符至少1次
\{m\} 匹配前面字符m次
\{m,n\} 匹配前面字符至少m次,至多n次。
位置匹配:
^ :表示以什么开头
$ : 表示以什么结尾
\< :匹配单词词首
\> : 匹配单词词尾。
文件的复制移动删除
cp 复制文件和文件夹
语法 : cp [option]... SOURCE DEST (复制单个源到目标)
cp [option]... SOURCE... DEST (复制多个源到目标)
注: ... 表示可以存在多个
例子:
1. 复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
解:此时就需要通过通配符来完成该操作了。
mkdir /tmp/mytest{1,2,3}
cp -r /etc/p*[^[:digit:]] /tmp/mytest1
2 . 复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
解: cp -r /etc/*.d /tmp/mytest2
3. 复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。
解: cp -r /etc/[l,m,n]*.conf /tmp/mytest3
cp的常用选项:
-r ,-R: 递归复制,复制目录下所有目录和文件
-i : 交互式
-a : 归档,保留元数据属性,相当于-dR -preserv=all
-d : 不复制真实的文件,还是保持该文件为链接文件
-L : 复制文件真实内容,文件不存为链接文件
-p : 保留 属主,属组,时间戳
mv 移动文件夹(用于改文件名)
语法 : mv [option]... SOURCE DEST (移动单个源到目标)
mv [option]... SOURCE... DEST (移动多个源到目标)
rm 删除文件或文件夹
语法: rm [option]... FILE...