文件管理
The Root Filesystem(简单介绍)
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录
/bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动机会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特俗文件存储位置
b:block device,随机访问
c:character device,线性访问
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr:universal shared ,read-only data
bin:保证系统拥有完整功能而提供的应用程序
sbin:
lib:32位使用
lib64:只存在64位系统
include:C程序的头文件(header files)
share:结构化独立的数据,如doc,man等
local:第三方应用程序的安装位置
bin,sbin,lib,lib64,etc,share
/var:variable data files
cache:应用程序缓存数据目录
lib:应用程序状态信息数据
local:专用于为/usr/local下的应用程序存储可变数据;
lock:锁文件
log:日志目录及文件
opt:专用于为/opt下的应用程序存储可变数据;
run:运行中的进程相关数据,通常用于存储进程pid文件
spool:应用程序数据池
tmp:保存系统两次启动之间产生的临时数据
/proc:用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux:security enhanced Linux ,selinux 相关的安全策略等信息的存储位置
注意点:linux所谓的大小写敏感是因为文件系统的原因,而并非linux系统本身的原因;Windows对文件后缀是有严格规定的而linux是不关心后缀的,只有在压缩打
包那一块是关心后缀的;
定义文件颜色需要访问:cat /etc/DIR_COLORS这个文件
pwd(printing working directory)
显示当前shell的绝对路径
参数:
-L:显示连接路径(默认)
-P:显示真实物理路径
ls(列出目录内容)
ls -a 包含隐藏文件
ls -1 文件分行显示(竖着显示)
ls –S 按从大到小排序
ls –t 按mtime排序
ls –u 配合-t选项,显示并按atime从新到旧排序
ls –X 按文件后缀排序
stat(查看文件状态)
ctime:元数据修改,会导致时间的改变,ll需要加上--time=ctime;
mtime:修改文件内容,会导致改变,ll默认显示mtime;
atime:访问一次会更新时间,记录最后一次读,--time=atime
relatime
centos6之后引入了一种机制relatime,是为了每次读一次,不会频繁的去更新时间,这样会带来很多磁盘的I/O,因为系统写一次的时间比读要慢的多,而access就
是要写入,所以为了避免性能的损失,relatime设置为一天以后才会去写入;还有就是mtime的时间与atime一样或者比atime新时会更新;
文件通配符
*:匹配0个或多个;
?:任何单个字符(包括汉字也算一个字符);
~:家目录
~wang:去wang的家,root可以任意去别人家,普通用户不能去root家;
~-:上一个目录,用于用ls这类命令去直接打开上一次目录的;
~+:同.
^:非
[0-9]:匹配数字范围的其中一个(只能是正序的;)
不连续就挨个写,比如135[135];
注:[a-b]与[ab]是有区别的;
[a-b]他是aAb这样的排序下去的,所以[a-c]:就是有aAbBc这些,同样的[A-B]就是为AbB(小大小大),而[ab]就是指单单的a与b;
所以以上的方法显示纯小写字母,大写字母是不可能了的那么怎么显示呢?用[:lower:]<-->a-z;[:upper:]<-->A-Z;最外面的[]的意思是中间的内容选一个的意思;
[[:lower:]]:就是显示某个小写的字母;当然也可以与数字连用[[:lower:]123]
[[:upper:]]:任意大写字母;
[[:alpha:]]:任意大小写字母;
[[:digit:]]:任意数字相当于0-9;
[[:alnum:]]:任意数字或字母;
[[:space:]]:水平或垂直空白字符;
[[:punct:]]:标点符号;
touch命令:
作用:
1、创建新文件;
2、改变时间戳;(而且刷新的是3个时间)
创建新文件目前知道3种了:
1、touch,比较安全,就算文件存在,最多也就更改时间戳
2、>比较危险,可能会清空文件;
3、dd if=/dev/zero of=/PATH/TO/SOMEWHERE bs=1024 count=100,创建一个100M的空文件
参数:
-t:修改atime和mtime的时间戳(年月日时分秒);
-c:文件不存在也不创建,仅仅是刷新已经存在的时间戳;
-a:仅改变atime和ctime;
-m:仅改变mtime和ctime;
ctime是元数据相关的,一般内容改变了大小会变所以mtime改变会影响ctime,访问时间的改变也会影响ctime的改变;
cp
一个源文件:
不存在:创建并将内容填充;
文件:覆盖加改名;
目录:目录中有同名,填充文件;没有同名,就创建同名文件,内容填充至新文件;
多个源文件:
不存在:提示错误
文件:提示错误
目录:新建同名文件,内容填充于此;
目录(需使用-r):
不存在:复制SRC目录下所有文件至新建同名目录;
文件:提示错误
目录:新建同名目录,递归复制于此
参数:
-f:--force
这里的强制是指,比如你在/root下创建的文件他的所有者和属组都是root,那么如果你用普通用户去覆盖他,就需要用-f去强制执行,其原里是,删除原来文件去新建,所有者和属组的文件;
-r/R:递归;
-i:覆盖前提示;
-n:如果目标存在不覆盖,注意两者顺序;
-d:--preserv=links不复制源文件,只复制链接名;(默认cp是复制软连接真实指向的内容;)
-preserv=all + -dR<-->-a:
-v:显示过程
-u:--update只复制源比目标新的的文件或目标不存在的文件;
可用于配置文件;
--backup=numbered:文件名存在的时候,覆盖会做一次配备分,名字为原来的名字加上.~#~
注:cp只能复制一般的文件,比如复制/dev/zero这个文件加上-a参数还可以,如果不加参数,他会不断输入0去填充你的目标文件,最终将你的磁盘的占满,所以这里有专门复制设备文件,mknod /app/zero c 1 5(为字符设备,主设备号为1,次设备号为5;)
rename:改名(做批量备份)
rename [options] expression replacement file...
例:rename '.log' '.log.bak' f*
tree:
参数:
-d:只显示目录;
-L level:指定显示的层数;
-P pattern:显示由正则表达式匹配的;
mkdir:
-p:递归创建;
-v:过程;
-m MODE:创建目录时直接指定权限;
rmdir:只能删空目录
-p:从内往外分析是否是空目录往外删;
-v:过程;
lsof:查看进程打开的文件
lsof|grep deleted,可以看到文件已经被删除了,但是没有被释放的,比如你vim还在编辑此文件,在这里可以查看的到;在这里能看到的都是已经删了,但是还没有释放的文件;
对于大文件的删除:
> /boot/bigfile:这样清空内容是最好的办法,速度也是最快的;接下来如果不需要了再rm删除;这样能马上释放文件,如果用rm直接删的话,有时候如果在使用的话,那么其实删了内存也没释放;
watch -n 1 :1秒去执行一次,适合去监控;
I/O:
程序:指令+数据;
单单使用一些指令没有数据是没有意义的,那么我们的内存是断电易失的设备,而且容量有限,所以需要配合磁盘来使用,那么就需要用到I/O;
打开的文件都有一个fd:file description(文件描述符),是数字;
例子:当我们用一个shell用vim去编辑一个文件的时候,通过ps aux|grep vim;可以看到在正在使用的进程编号;然后在进入到/proc/进程编号/fd,可以看到文件描述符(高亮显示的数字4),也可以看到正在打开/root/.f1.swp;
vim的工作特性:
你打开vim的时候,他不是真正在用vim,而是临时的先开了/root/.f1.swp,只有你修改完存盘他才会真正的去使用vim;这个文件在运行时,可以在/root下看到,而关闭vim的时候,就看不到了;
STDIN(0):
默认是键盘的输入;
STDOUT(1):
默认是当前终端窗口输出;
STDERR(2):
默认是当前终端窗口输出;
重定向的意义是改变默认I/O位置;
>(STDOUT):
ls > /dev/pts1;可以将输出内容到其他终端下;
set -C:禁止覆盖已有文件,但可追加;
>| file:强制覆盖;
set +C:允许覆盖;
如果要多条命令追加的话,用()来括起来;
(ls;pwd;hostname) > /app/all.log;
/dev/null;
用于以后写脚本时候,你不想要的在屏幕上显示的数据;
例子:
(echo error 1>&2) >/dev/null
在屏幕上还是会显示,1>&2,就是把正确的跟错误的一样输出(1>&2,前面跟后一样),所以当错误的输出,所以不会去黑洞,而是在屏幕显示;
(errcmd;hostname) 2>&1 > /app/aaa;
系统是这样分析的,错误的结果,正确的结果 2>&1 >/app/aaa;第一层()的效果仅仅是执行的结果;然后错误的仍然照常输出,正确的经过2>&1判断下由于正确的被放到/app/aaa里去了,所以屏幕上只显示第一项
((errcmf;hostname) 2>&1) > /app/aaa;
(错;对 2>&1) >/app/aaa;错变对之后是(对;对)>/app/aaa所以内容都进文件了,屏幕上无输出;
1>&2:对变错;2>&1:错的变对的;
tr:
处理输入信息的(转换和删除字符串的,后换前);
默认是键盘输入,所以你输入tr,跟cat同理,都是等待键盘的输入的;所以tr和cat也可能利用<(输入重定向来)来接收文件的信息;
参数:
-t:截断;
tr -t 123 ab;后面只有2个所以会截断到前面2个,3不做替换;
-d:指定删
tr -d 'a-z' < /etc/fstab;
把所有小写的都删了;
tr -dc 'a'
会除了a都算,连按的回车也算,所以结束输入需要用ctrl+d;’a\n‘这样是保留a和回车;
-s:把连续出现的自动内容压缩成一个;
tr -s " " :
压缩了之后再用:代替空格;
这种方法在日后的操作中非常多用,当有很多分割符的时候可以用tr来改成一个来处理;
-c:取反;
tr -sc 'a';
就是除了a都去重;
tee:
在屏幕上显示又输出到文件;
相当于有多了一条路,如T字路,多一条屏幕输出的路,又可对其进行操作了;功能更强大了;
-a:这个命令不加-a参数是覆盖的,-a是追加;
指定文件描述符:exec 8<> f1
指定f1文件的fd为8;
ll /proc/$$/fd(他相当于是软连接指向f1);
$$是当前进程;这样可以看到刚刚指定的f1的fd为8;
取消指定的符号描述符:
exec 8>&-