文件管理
文件管理
文件管理是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除等等。linux一切皆文件,所有的修改最终都是对文件操作。
1 linux文件目录结构
几乎所有的计算机操作系统都是使用目录结构组织文件。一般使用树状的文件结构,所以该结构又被称为“目录树”。
windows的目录数据结构是森林,多根;linux是树,单根。
/
根目录,所有的文件都在它的下面bin
二进制可执行文件,这个目录存放着最经常使用的命令,如ls,yum等等boot
这里存放的是与系统启动相关的文件,包括一些连接文件以及镜像文件,linux内核文件也在这里dev
是Device(设备)的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的etc
用来存放配置文件和子目录,包括yum/rpm安装的软件配置文件等等home
普通用户的家目录,在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,如用户bob的主目录就是 /home/bobroot
系统管理员用户家目录run
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。sbin
这里存放的是系统管理员使用的系统管理程序tmp
存放临时文件usr
是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下var
在系统运行后才会渐渐占用硬盘容量的目录,目录主要是常态性变动文件,包括缓存(cache)、登录文件(logfile)以及某些软件运行所产生的文件,包括程序文件(lock file,run file),或者例如Mysql数据库的文件等
下面分别来介绍一些根目录下常见的文件夹
1.1 usr目录
是一个非常重要的目录,相当于win系统的C:Windows,目录结构如下
usr/bin/
用户所用命令,根目录下的bin目录是软链接到这里的binusr/sbin/
系统管理员命令,与用户相关,根目录下的sbin也是软链接这里的sbinusr/etc/
该目录用于存放配置文件usr/local
软件安装的目录,相当于C:Program filesusr/lib
所有可执行文件所需要的库文件,Glibc 32bit,类似于windows下的dll文件usr/lib64
所有可执行文件所需要的库文件,Glibc 64bitusr/include
各种头文件,编译文件等时需要使用usr/games
曾经包含游戏等文件,现在很少用到usr/local
本地系统管理员用来自由添加程序的目录
1.2 etc目录
存放的是配置文件。极其重要,所有服务的配置都在这个目录中,常用的有:
/etc/sysconfig/network-scripts/ifcfg-* # 网络配置文件
/etc/hostname # 系统主机名配置文件,主机名很重要,有些特殊服务要依赖主机名,没有主机名会报错起不来;修改了要重启:reboot
/etc/resolv.conf # dns客户端配置文件,域名解析服务器,一般我们不配置,因为网卡的配置好了,会覆盖掉它,网卡的优先级高
/etc/hosts # 本地域名解析配置文件,域名解析,先找自己的hosts,再去域名解析
1.3 var目录
存放一些常态性变动文件,比如缓存、日志、登陆文件等等。
# 查看用户登录登陆日志
cat /var/log/secure
1.4 dev目录
该目录下存放的是 Linux 的外部设备,比如硬盘,硬盘分区,光驱,等等。
/dev/sd # 硬盘设备
/dev/null # 黑洞设备,只进不出。类似于垃圾回收站
/dev/random # 生成随机数的设备
/dev/zero # 能源源不断的产生数据,类似于取款机
# 还有一些这种文件sda sdb sdc sda1 sdb4,它们是磁盘文件
# linux中磁盘文件叫sd,第一个硬盘叫a,第二个叫b,sda1表示第一个磁盘的第一个分区,sdb4:第二个硬盘的第四个分区(服务可以插很多硬盘)
1.5 proc目录
根目录下的proc是反映系统当前进程的实时状态,如对应的进程停止则/proc下对应目录则会被删除
ls /proc # 可以看到很多id号,pid号,进程号,唯一
# 如果进程被关闭,id号的文件夹就没了
# id号每次启动都不唯一,只有一个进程唯一,systemd 是进程号1的进程,所有进程都是基于它派生出来的
1.6 其他文件夹
/media # 提供设备的挂载点,媒体文件。linux新增了盘符,需要手动挂载,把光盘里的数据,挂载到media目录
mount /dev/cdrom /media/
/mnt # 提供设备的挂载点(同上)
/opt # 第三方工具,第三方软件默认安装的(mysql...)
/bin, /sbin, /lib, /lib64 # 这些文件都以软链接的形式链接到/usr/目录下
2 文件管理命令
2.1 创建文件
touch file # 没有则创建,有则修改时间
touch file2 file3 # 创建两个文件
touch /home/od/file4 file5 # 绝对路径创建
touch file{a,b,c} # {}集合,等价 touch a b c
touch file{1..10} # 从1-10循环创建
touch file{a..z} # 从a-z循环创建
2.2 创建文件夹
# 选项:-v 显示详细信息 -p 递归创建目录
mkdir dir1 # 当前目录创建dir1文件夹
mkdir /home/od/dir1 /home/od/dir2 # 绝对路径创建两个文件夹
mkdir -v /home/od/{dir3,dir4} # -v参数 打印出详细信息;如果没有od则创建失败,大括号内写文件夹名字,写几个就创建几个
mkdir -pv /home/od/dir5/dir6 #-p 递归创建,如果没有od文件夹,则创建一个,没有dir5则创建一个,以此类推
2.3 删除
# 选项:-r: 递归 -f: 强制删除 -v: 详细过程
rm file.txt #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件
rm -f file.txt #删除文件, 不提醒
rm -r dir/ #递归删除目录,会提示
rm -rf dir/ #强制删除目录,不提醒(尽量少用)
# 1.rm删除示例
mkdir /home/dir10
touch /home/dir10/{file2,file3,.file4}
rm -f /home/dir10/ # 不包括隐藏文件
ls /home/dir10/ -a
# 2.rm删除示例2
touch file{1..10}
touch {1..10}.pdf
rm -rf file* # 以file开头的全删
rm -rf *.pdf # 以.pdf结尾的删除
2.4 移动
mv file file1 #原地移动==改名,把file改名file1
mv file1 /tmp/ #移动文件至tmp目录
mv /tmp/file1 ./ #移动tmp目录的文件至当前目录
mv dir/ /tmp/ #移动整个dir目录至/tmp目录下
touch file{1..3}
mv file1 file2 file3 /opt/ #移动多个文件或至同一个目录
mkdir dir{1..3}
mv dir1/ dir2/ dir3/ /opt/ #移动多个文件夹至同一个目录
2.5 复制
#选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性
cp file /tmp/file_copy #复制file到某个目录下
cp name /tmp/name11 #修改名称
cp file /tmp/ #不修改名称
cp -p file /tmp/file_p #-p保持原文件或目录的属性(权限、创建时间等)
cp -r /etc/ /tmp/ #复制目录需要使用-r参数, 递归复制
cp -rv /etc/hosts /etc/hostname /tmp #拷贝多个文件至一个目录
cp -rv /etc/{hosts,hosts.bak} # 把hosts复制一份,改名叫hosts.bak
2.6 查看文件内容
#------cat 文件查看
cp /etc/passwd ./pass
cat pass #正常查看文件方式
cat -n pass #-n显示文件有多少行
cat -A pass #查看文件的特殊符号,比如文件中存在tab键
tac pass #倒序查看文件
cat >> test2.txt <<EOF # 可以输入内容,写入文件,以EOF结尾
ads
adf
EOF
#------less、more 文件查看,可以分页
less /etc/services #使用光标上下翻动,空格进行翻页,q退出
more /etc/services #使用回车上下翻动,空格进行翻页,q退出(有百分比)
#------head 文件查看,从头部开始
head pass #查看头部内容,默认前十行
head -n5 pass #查看头部5行,使用-n指定
ps aux | head -5 # 只看头部5个进程;ps aux查看进程
#------tail
tail pass # 查看文件尾部,默认10行
tail -20 /var/log/secure # 查看文件尾部20行
tail -f /var/log/messages # -f动态查看文件尾部的变化
tailf /var/log/messages # 查看文件尾部的变化
ps aux | tail -2 # 看尾部的2个进程
#------grep过滤文件内容
grep "^root" pass #匹配以root开头的行
grep "bash$" pass #匹配以bash结尾的行
grep -i "ftp" pass #忽略大小写匹配
grep -Ei "sync$|ftp" pass #匹配文件中包含sync结尾或ftp字符串
ps aux | grep ssh # 查看ssh进程是否运行
# ------上翻,下翻
control+b:下翻
control+f:上翻
2.7 文件的上传与下载
wget、curl联网下载文件
# 如果没有wget命令,首先需要安装
yum install wget -y
wget url地址 # 从远程下载到本地,默认下载到当前路径
wget -O /etc/yum/aaa.img url地址 # 参数-O 指定下载路径
# crul:浏览网络上资源,测试连通性,-o保存到本地
#选项: -O: 指定下载地址
curl -O /etc/yum/aaa.html https://www.baidu.com/
rz,sz上传下载文件
# 如果没有rz,sz命令,首先需要安装
yum install lrzsz -y
rz # 只能上传文件(最大不能超过4g)
sz /path/file # 只能下载文件
2.8 文件查找
文件查找
locate /etc/sh #搜索etc目录下所有以sh开头的文件
locate -i /etc/sh #搜索etc目录下,所有以sh开头的文件,-i 忽略大小写
命令查找
which ls # 查找ls命令的绝对路径
whereis ls # 查找命令的路径、帮助手册、等
whereis -b ls # 仅显示命令所在的路径,仅看二进制
# 对于内核相关的一些命令,用which whereis 是无法查询到的,需要使用type查询
type -a ls # 查看命令的绝对路径(包括别名)
type -a for
2.9 字符处理
在有些情况下,需要对应一个无序的文本文件进行数据的排序,使用sort进行排序。
sort [OPTION]... [FILE]...
# -r:倒序 -n:按数字排序 -t:指定分隔符(默认空格) -k:指定第几列, 指定几列几字符(指定1,1 3.1,3.3)
#1.首先创建一个文件,写入一写无序的内容
cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF
#2.使用sort下面对输出的内容进行排序
sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11
#结果并不是按照数字排序,而是按字母排序。
#可以使用-t指定分隔符, 使用-k指定需要排序的列。
# -t 指定分隔符,-k指定列,按第二列排序
sort -t ":" -k2 file.txt
d:1
f:11 #第二行是11,因为按照ascii码进行排序
c:2
b:3
a:4
e:5
#按照排序的方式, 只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小。
#如果想要按照数字的方式进行排序, 需要使用 -n参数,按数字排序。
sort -t ":" -n -k2 file.txt
d:1
c:2
b:3
a:4
e:5
f:11
uniq
如果文件中有多行完全相同的内容,希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq
命令解决这个问题(但是必须配合sort
使用,相邻的才能去重,所以要配合sort)。
uniq [OPTION]... [INPUT [OUTPUT]]
#选项:-c 计算重复的行
#1.创建一个file.txt文件:
cat >>file2.txt <<EOF
abc
123
abc
123
EOF
#2.uniq需要和sort一起使用, 先使用sort排序, 让重复内容连续在一起才能去重
cat file.txt |sort
123
123
abc
abc
#3.使用uniq去除相邻重复的行
cat file.txt |sort|uniq
123
abc
#4.-c参数能统计出文件中每行内容重复的次数
cat file.txt |sort|uniq -c
2 123
2 abc
wc统计行号
wc [OPTION]... [FILE]...
#选项:-l显示文件行数 -c显示文件字节 -w显示文件单词
wc -l /etc/fstab #统计/etc/fstab文件有多少行
wc -l /etc/services #统计/etc/services 文件行号
ls |wc -l #统计当前路径下有多少文件和文件夹
ps aux | grep ssh | wc -l #统计有多少ssh相关的进程
2.10 文件属性
当我们使用ls -l
列出目录下所有文件时,通常会以长格的方式显示,其实长格式显示就是我们Windows下看到的文件详细信息,也称为文件属性,那整个文件的属性分为十列。
-rwxr-xr-x. 1 root root 117656 Jun 30 2016 /bin/ls
srw-rw-rw-. 1 root root 0 Jan 20 10:35 /dev/log
brw-rw----. 1 root disk 8, 0 Jan 20 10:36 /dev/sda
crw--w----. 1 root tty 4, 1 Jan 20 10:36 /dev/tty1
lrwxrwxrwx. 1 root root 22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--. 1 root root 199 Jan 20 11:03 /etc/hosts
prw-------. 1 root root 0 Jan 20 10:36 /run/dmeventd-client
drwxrwxrwt. 61 root root 8192 Jan 21 13:01 /tmp
############################################
-rw-------. 1:第一个字符是文件类型,其他则是权限
1 2:硬链接次数
root 3:文件属于哪个用户
root 4:文件属于哪个组
1418 5:文件大小
May30 13:58 6,7,8:最新修改的时间与日期
a.cfg 9:文件或目录名称
############################################
文件类型
通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过ls -l以长格式显示一个文件的属性,通过第一列的第一个字符来近一步的判断文件具体的类型。
- “-”表示普通文件(文本, 二进制, 压缩, 图片, 日志等)
- “d”表示目录
- “l”表示链接文件
- “p”表示管道文件
- “b”表示块设备文件,存储设备硬盘 /dev/sda1, /dev/sda2
- “c”表示字符设备文件,终端 /dev/tty1, /dev/zero
- “s”表示套接字文件,进程间通信(socket)
但有些情况下,我们无法通过ls -l文件的类型,比如: 一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来更加精准的判断这个文件的类型。
file /etc/hosts
/etc/hosts: ASCII text
file /dev/sda
/dev/sda: block special
file /dev/tty1
/dev/tty1: character special
file /home
/home: directory
file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)
权限
其属性可分为三段:[rwx][r-x][r-x]
,其中第一段表示文件创建者/所有者对该文件所具有的权限,第二段表示创建者/所有者所在的组的其他用户所具有的权限,第三段表示其他组的其他用户所具有的权限。(本人的权限,组内的权限,组外的权限)
- r(Read,读取权限):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
- w(Write,写入权限):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
- x(Execute,执行权限):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
软链接/硬链接
文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
-
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block。
-
元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息,我们称其为Inode。
在Linux中,inode是文件元数据的一部分,但其并不包含文件名,inode号即索引节点号,文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
Linux 系统引入了两种链接:硬链接 ( hard link ) 与软链接(soft link)
- 软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。
- 若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,如下图hard link 就是 file 的一个别名,他们有共同的 inode。
# 举例
touch /root/file
ln -s /root/file /tmp/file_bak # root下file链接到/tmp下并重命名为file_bak -s参数:软链接
# 软链接目录
mkdir /soft/nginx1.1 -p
ln -s /soft/nginx1.1/ /soft/nginx # soft下的nginx1.1/文件夹软链接到/soft/nginx
# 硬链接
ln /root/file /tmp/file_hard # 创建硬链接
所有者,组
表示该文件的所有者/创建者(owner)及其所在的组(group)。
文件大小
如果是文件,则表示该文件的大小,单位为字节。
如果是目录,则表示该目录符所占的大小,并不表示该目录下所有文件的大小。
修改日期
该文件最后创建/修改的日期时间。
文件名称
在大多数的linux shell窗口中,还能用颜色来区分不同文件的属性。
- 灰白色表示普通文件
- 亮绿色表示可执行文件
- 亮红色表示压缩文件
- 灰蓝色表示目录
- 亮蓝色表示链接文件
- 亮黄色表示设备文件
总结
本文来自博客园,作者:yyyz,转载请注明原文链接:https://www.cnblogs.com/yyyzyyyz/p/15563336.html