1、文件系统分层结构: LBS Linux Standard Base
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录
/bin:供所有用户使用的基本命令;不能关联至独立分区, OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区, OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
注意:
文件名称区分大小写
以.开头的文件为隐藏文件
字符设备是顺序访问的,块设备是随机访问的
dev/zero 是字符设备 c
sda 是块设备 b block
块设备有缓存,字符设备没有缓存
设置文件设备颜色 /etc/DIR_COLORS
bin实际是个软连接 快捷方式
所以 ll /bin/ ll /bin 有区别 因为bin目录是个软链接
2、ls命令、wc命令、时间戳、stat命令、通配符glob
ls命令
ls -a 包含隐藏文件
ls -l 就是ll 显示额外的信息
ls -R 目录递归情况
ls -1 文件分行显示
ls -S 按大到小排序
ls /data -lt 按照数据修改时间排序从新到旧(mtime)
ls /data -ltu 按照访问时间排序从新到旧(atime)
ls /data -ltc 按照元数据修改时间排序从新到旧(ctime)
ls -U /data 按照排放次序排序,即创建次序 旧的文件排在前面 新的排后
ls -X 按文件后缀排序
ls -r 倒序排列文件
ls -d 只在本目录不进入文件夹
ls -d */ 只显示当前目录文件夹
ls -i 查看文件inode 节点编号
例如在/data下有/dir1和/dir2两个目录
那么只显示目录的方法是:
ls -d /data/*/
ls -d .* 显示当前目录下的隐藏文件以及文件夹
ls -R 递归目录
ls -R .* 显示当前目录和子目录的包含../父目录文件
ls -R .[^.]* 显示递归隐藏文件
ls -Rd .[^.]* 显示本目录而不进入子目录递归的隐藏文件
ls -ad .[^.]* 不显示.和.的显示本目录的隐藏文件
wc命令
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
stat命令
查看单个文件3个时间
文件数据分为:metadata(元数据), data
三个时间戳:
access time:访问时间,atime,读取文件内容
modify time: 修改时间, mtime,改变文件内容(数据)
change time: 改变时间, ctime,元数据发生改变
文件名优先级排列顺序 数字 小写字母 大写字母
atime 读取时间(access time) ctime 元数据修改时间 meta data 例如 拥有者名字。。。
不修改数据则会变化读时间
ll –time=atime /data/1 查看/data/1的读时间
ll –time-ctime /data/1 查看/data/1元数据(状态)修改时间
stat /data/file6 看file6的所有时间
glob 通配符
ls /etc/*.conf
* 一个或多个字符
? 一个字符
注:汉字是2个字节一个字符
ls ~-/data 列出上一个进入目录下的/data
ls file[1..20] 表示 1 或者2 或者.或者0 4个文件
ls file[1-20] 表示1到20
ls file{1..20} 表示1到20
touch {A..D} 则创建 A B C D四个文件
touch f[A-D] 则创建f[A-D]这一个文件
ls f[a-d]则列出 fa fA fb fB fc fC fd 不会列出fD
ls f[A-D]则列出 fA fb fB fc fC fd fD 不会列出fa
如果有a b c abc四个文件ls /data/[abc] 会显示a,b,c这三个文件但不会显示abc这个文件
如果有a b c d 四个文件 ls /data/[^abc] 则会显示d 就是排除的意思
[]代表选择中间的任意一个字符而不是全部字符
[:digit:] 任意数字0-9
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:alpha:]任意大小写字母
[:alnum:]任意数字或字母
ls f[[:upper:]] 列出所有包含单个大写字母的文件
帮助文件 man 7 glob
练习
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录
5、显示/etc目录下,所有以.d结尾的文件或目录
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
7、只显示/root下的隐藏文件和目录
8、只显示/etc下的非隐藏目录
练习答案
1. ls /var/l*[[:digit:]]*[[:lower:]]
2. ls /etc/[[:digit:]]*[^[:digit:]]
3. ls /etc/[^[:alpha:]][[:alpha:]]*
4. ls -d /etc/rc[0-6]*
5. ls -d /etc/*.d
6. ls -d /etc/[mnrp]*.conf
7. ls -d /root/.*
8. ls -d /etc/[^.]*/
3、touch、cp、mv
touch命令
生成文件名为前一天时间的日志文件:
touch `date -d “-1 day” +%F`.log
注:
/etc/motd 是设置用户登陆后的提示信息
/etc/issue 是设置用户登陆前的提示信息
例:如果本来已经存在/etc/motd
touch /etc/motd
则不会改变文件,但是会刷新文件的3个时间
如果使用> /etc/motd 则会改变原文件变成空文件而且改变mtime和ctime(利用此特性可以删除大文件)
例如创建大文件bigfile
dd if=/dev/zero of=/data/bigfile bs=1M count=1024
有一个bigfile大文件,则删除大文件,释放磁盘空间安全的方法为:
> bigfile
rm -f bigfile
原理就是利用> bigfile 创建同名文件会覆盖原大文件变成一个小文件,然后删除
touch -a 仅改变atime和ctime
touch -m 仅改变mtime和ctime
touch -t 指定atime和mtime的时间戳
touch -t 201910200830.50 /etc/hosts
touch -c 如果文件不存在则不予创建
cp命令
cp -r 才能复制目录
cp -d 保留原始链接属性,例如原文件是软链接 则复制后还是原软链接
cp -p 默认保留模式 拥有者 时间戳等如果可能还保留上下文 链接还有额外信息等没有-r功能
cp -a /etc/ /data/etcbackup 保留属性的备份 -a保留所有属性(最全)
复制/dev/sda /dev/zero 之类的必须用cp -a 才能成功因为能保留所有属性
cp -u 只复制源比目标更新的文件
cp -av /usr /data/ v可以看到过程一般复制大文件用,可以看到过程防止死机
cp –backup=numbered f1 /data/f1 复制同时建立原文件的备份,生产环境中建议加入原cp别名
alias cp=’cp -i –backup=numbered’ 写入 .bashrc内
1、定义别名命令baketc,每天将/etc/目录下所有文件,备份到/app独立的子目录下,并要求子目录格式为
backupYYYY-mm-dd,备份过程可见
2、创建/app/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限
练习题答案
1. alias baketc=`cp -av /etc /data/backup`date +%F“ 注意目录如果/etc/则会失败或者/etc/*会没有包含
隐藏文件
2. cp -a /root /data/rootdir
mv移动和重命名文件
mv -i 交互式
mv -f 强制式
如果mv命令的目标和源在相同的文件系统,作为mv 命令用新的文件名创建对应新的目录项删除旧目录条
目对应的旧的文件名不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
如果目标和源在一个不同的文件系统, mv相当于cp和rm
rm删除命令
rm -i 交互式
rm -f 强制删除
rm -r 递归
一般使用 rm -rf
链接数递减,从而释放的inode号可以被重用把数据块放在空闲列表中删除目录项数据实际上不会马上被删
除,但当另一个文件使用数据块时将被覆盖。
rename 批量文件改名
rename “conf” “conf.bak” file* 批量备份conf后缀的文件为conf.bak
alias rm=`mv -t /data` rm变为mv到/data文件夹 建议设置
mv /root/Downloads/ /data/ 把目录移动到/data/目录下
平时生产中一般磁盘空间大于80%就要报警了
lsof |grep deleted 查看是否有文件已经删除单没有释放空间
例如在本终端删除文件,而其他终端还有人在访问该文件
有一个bigfile大文件,则删除大文件,释放磁盘空间安全的方法为:
> bigfile
rm -f bigfile
就是利用> bigfile 创建同名文件会覆盖原大文件变成一个小文件,然后删除
注意touch命令只是改变3个时间但是不会改变内容
4、tree、mkdir、rmdir
tree
tree命令centos6需要安装~
tree -L 只显示第一层 -L 2 显示1.2层
tree -L -d 只显示第一层文件夹
mkdir创建目录
mkdir -p 可以一次创建深目录
例如 mkdir -p /data/dir1/dir2/dir3/dir4
如果想看到创建过程可以加v
例如mkdir -pv /data/dir1/dir2/dir3/dir4
创建目录时直接指定权限则可以:
mkdir -m
rmdir 删除空目录
如果不是空的也不会删除
rmdir -p 则是递归删除父空目录 就是从最低层开始一层层查空目录如果是空则删除
例如执行rmdir -d /data/dir1/dir2/dir3/dir4 如果都为空目录则会直接删除右边4个,data是挂载点所以不
会删除
rm -r 则是递归删除目录树不管目录是不是为空!
习题
(1) 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a,/testdir/dir1/x/b, /testdir/dir1/y/a,
/testdir/dir1/y/b
(2) 如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b
(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6,/testdir/dir5/dir7
练习题答案:
1.mkdir -p /testdir/dir1/{x,y}/{a,b}
2.mkdir -p /testdir/dir2/{x/{a,b},y}
3.mkdir -p /testdir/dir{3,4,5/dir{6,7}}
cp /etc/hosts{,.bak} 备份文件
等价于 cp /etc/hosts /etc/hosts.bak
encho file{,b}
则为 file fileb
5、节点编号inode以及节点表、硬链接以及软链接
节点编号inode
ls -i 查看节点编号
同一分区中节点编号唯一
inode table 节点表
注意:
节点编号有限如果发现空间没用光而创建文件失败则很可能是因为系统节点编号已经用光
touch file{1..52000} 会显示错误因为这样写等价于
touch file1 file2…file52000参数太长应该这样写
echo file{1..524288} |xargs touch
如果删除
echo file{1..524288} |xargs rm
或者直接删除目录
shred -zv -n 6 hosts 用随机数据填充空间然后反复覆盖6次文件hosts
shred -zvu -n 6 hosts 填充完后删除文件hosts
硬链接
ln f1 f2 为文件f1创建硬链接f2
文件夹不能创建硬链接
文件的初始链接数为1,文件夹初始链接数为2因为有当前/.这个链接
创建硬链接只能在同一磁盘分区,因为节点编号跨磁盘分区是不唯一的
硬链接的作用就是一个文件有几个名字
软链接
ln -s f1 f3 为文件f1创建软链接f3
ln -s ../date/f2 /root/f2_link 这里的相对路径是相对/root的路径而不是当前目录的路径必须注意!
readlink 看软链接指向原始文件
一般生产中部署软件都用软链接,方便部署,例如nginx-1.10升级到nginx-1.12可用以下方法:
ln -s nginx-1.10 nginx
rm -f nginx
ln -s nginx-1.12 nginx
软,硬链接本质区别:
硬链接:同一个文件多个名字
软链接:一个文件对应快捷方式,不同文件
1、链接数
2、跨分区
3、目录
4、原始和链接文件关系
5、删除
6、大小
6、file命令、标准输入,标准输出
file 查看文件类型
通过打开文件分析magic number来实现文件分析的
file -f filelist 列出文件filelist中文件名的文件类型
可用nano filelist在里面添加如/etc/hosts /data /bin/ls然后
file -f filelist 显示3个文件类型信息
标准输入和输出
程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种I/O设备
标准输入(STDIN)-0 默认接受来自键盘的输入
标准输出(STDOUT)-1 默认输出到终端窗口
标准错误(STDERR)-2 默认输出到终端窗口
I/O重定向:改变默认位置
ll /proc/$$/fd
查看当前正在打开文件的文件描述符
exec 8<>/data/hosts
直接分配文件描述符8给hosts这个文件
cat /proc/$$/fd/8这时候等价于cat /data/hosts
删除用exec 8>&_
ls > /dev/pts/5 输出信息重定向到5号显示窗口
ls > /data/ls.out 正确信息重定向到文件 隐含有1> (同时如果不存在/data/ls.out则创建文件)
cmd 2>/data/err.log 错误信息重定向到文件/data/err.log 不存在则建立文件一个>只覆盖原内容,》是追
加新内容不覆盖原内容
ls /error /data >f1 2>f2 正确信息重定向f1 错误信息重定向 f2
ls /error /data >all.log 2>&1 正确的错误的信息都定向到all.log (对顺序敏感不能写反)
另一种写法
ls /error /data &>all.log
(ls;pwd)>all.log ls pwd 内容都重定向到all.log
hostname > /dev/null 重定向到黑洞~即没有内容输出
>bigfile 即空重定向bigfile即为空
》f1 这样创建是追加模式更安全 创建文件推荐
特殊内容无法重定向
思考哪个命令效果与众不同
A cmd > log 2>&1
B cmd 2>&1 > log
C cmd &> log
D cmd 2>log >&2
答案是B
STDOUT和STDERR可以被重定向到文件
命令 操作符号 文件名
支持的操作符号包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
?> 文件内容会被覆盖
set –C 禁止将内容覆盖已有文件,但可追加
>| file 强制覆盖
set +C 允许覆盖
>> 原有内容基础上,追加内容把输出和错误重新定向到文件
2> 覆盖重定向错误输出数据流
2>> 追加重定向错误输出数据流
标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1
():合并多个程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
(ls;pwd) > all.log
可以把不需要的信息直接重定向到/dev/null
ls > /dev/null 2>&1
hostname > /dev/null
又比如创建软链接
ln -s all.log all_link
> all_link
这样会导致原文件all.log内容被清空
标准输入重定向 例如
cat < /etc/hosts
表示把/etc/hosts文件里的内容用输入到cat
cat < f1 > f1 会清空文件f1
cat < f1 >> f1 会不断循环复制f1的内容
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95922