Linux学习总结3_文件与目录管理

目录

一、文件管理

1.文件属性查看 ls

2.文件属性修改

3.文件内容查看

4.文件创建与编辑

5.文件复制、移动、删除

(1)文件复制 cp

(2)文件移动 mv

(3)文件删除 rm

(4)文件远程复制 scp

6.文件搜索

(1)按照名称搜索 find

(2)按照文件内容搜索 grep

7.列出当前系统打开的文件 lsof

(1)输出信息含义

(2)常用参数

(3)使用实例:查看文件使用者

(4)使用实例:"too many files"问题定位

(5)使用实例:恢复删除的文件

二、目录管理

1.pwd:显示当前目录命令

2.cd:切换目录命令

3.mkdir:创建目录命令

4.rmdir:删除空目录命令

三、补充

1.修改单进程最大文件连接数

2.查看某进程占用的文件句柄数和线程数


一、文件管理

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

1.文件属性查看 ls

ls(list),常用参数如下:

  • -l:详细信息;
  • -t:按修改时间排序;
  • -h:人性化显示(hommization),与 -l 配合使用时文件大小单位可以不为字节。
  • -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来。

ls -l 或者 ll 命令可以显示文件的基本属性,显示效果如上,从左到右解析:

  • a)参数1分为两部分,第一位表示文件类型,-表示二进制文件(应该是文件),d表示目录,l表示软连接文件。
  • 参数1第二部分为后9位,每3位为一组,3组分别表示所有者、所属组、其他人权限。每组中的三位分别表示读权限(r)、写权限(w)、可执行权限(x),其中 - 表示无该权限。
  • b)参数2为引用计数,表示文件被引用过多少次。(可通过lsof <filename>查看引用情况)
  • c)参数3表示所有者,一般创建一个文件,所有者默认是创建者。
  • d)参数4表示所属组。
  • e)参数5表示文件字节大小,不带单位表示字节。(参数加-h可显示其他单位)
  • f)参数6表示文件的最后修改时间。注意:Linux没有明确的创建时间,只有最后一次访问时间、文件的状态修改时间、文件的数据修改时间。
  • g)参数7表示文件名。(有软连接的时候会有指向

补充Linux链接文件类型:

  • 硬链接:指向的索引节点号(i节点号)相同,两个硬链接文件完全平等,删除其中任何一个都不会影响另外一个的访问。文件真正删除的条件是与之相关的所有硬连接文件均被删除。(可以防止误删
  • 软链接:也叫符号链接,类似于 Windows 的快捷方式。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。A 和 A1 之间是“主从”关系,如果 A 被删除了,A1 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

生成链接文件命令:ln [-s] <source_file> <target_file> (-s 表示创建软链接,不加表示创建硬链接)

2.文件属性修改

更改文件属性的命令如下:

  • chown [-R] <所有者名> <文件名>:更改文件所有者,加 -R 参数表示递归修改文件夹下所有文件。
  • chown [-R]  <所有者名>:<所属组名> <文件名>:更改所有者和所属组。
  • chgrp [-R] <所属组名> <文件名>:更改所属组。
  • chmod [-R] <参数> <文件名>:修改文件权限,具体内容如下。

Linux文件的基本权限有9个,分别是owner/group/others三种身份各有自己的read/write/execute权限。

我们可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r:4
  • w:2
  • x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= --- = 0+0+0 = 0

还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:

  • (1)user
  • (2)group
  • (3)others

那么我们就可以使用 u/g/o 来代表三种身份的权限, a 则代表 all,即全部的身份。

我们修改文件权限时有如下方法:

  • chmod xyz <文件名>:xyz分别表示各组的权限累加。
  • chmod u=rwx,g=rx,o=r <文件名>:指定各组的权限。
  • chmod u+x,g-w <文件名>:通过+/-来增删权限。(如果不写g+x而写成+x,那默认是操作user权限)

3.文件内容查看

Linux系统中使用以下命令来查看文件的内容:

  • cat [-n] [-b] <name>:由第一行开始显示文件内容,-n 参数表示显示行号(包括空白行),-b 参数表示显示非空白行号。
  • tac:从最后一行开始显示,可以看出 tac 是 cat 的倒着写。
  • more <name>:分页显示文件内容。空格或者 f 翻页,回车下一行,q 退出。(无法往前翻页)
  • less <name>:与 more 类似,但是比 more 更好的是,他可以往前翻页。空格或者 f 翻页,q 退出。PgUp/PgDn前后翻页,但貌似只能翻已经看过的页面。/<string> 搜索关键字string,n 表示搜索下一个(向下),N 表示搜索上一个(向上)。(vi命令中也是这样搜索)
  • head [-n <num>] <name>:只看文件前几行,-n 表示前num行。
  • tail [-n num] [-f] <name>:只看末尾几行,-f 表示动态显示文件末尾内容,实时变化。也可以使用 tailf <name> 或者 tail -100f <name> 来动态显示文件末尾内容。Ctrl+C 结束显示。
  • nl:显示的时候,顺道输出行号。

4.文件创建与编辑

  • touch <name>:创建空文件,创建多个文件以空格分隔。
  • vi/vim <name>:创建或者编辑文件,创建文件时需要进入插入模式(点击a进入插入模式)后保存,否则直接退出的话,文件不会保存。(vim命令需要安装)

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

vim 主要有三种工作模式,分别是命令模式、插入模式和编辑模式:

  • 输入 vi 文件名 我们可以进入命令模式;
  • 输入字符 i或者a或者o(插入位置或者内容不同,平时用a即可)我们可以进入插入模式,进入插入模式之后我们可以进行文件的内容修改,修改完成之后,可以输入 :wq 可以保存退出。

vim命令可参考:https://www.cnblogs.com/ysocean/p/7751270.html(简单看看或者不看都行)

5.文件复制、移动、删除

(1)文件复制 cp

复制后的文件可直接改名。

常用参数说明:

  • -r:递归(recursion)持续复制,用於目录的复制行为。不带该参数时只能复制文件,带了该参数可复制文件或者目录。rm命令也有该参数,而mv命令没有该参数
  • -p:保留文件属性,加-p属性之后会将原文件的一些属性比如修改时间等也原封不动的复制过去。如果不加-p属性,那么复制后的文件修改时间为当前系统时间。
  • -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次。(目标文件不存在时可以不用该参数)(使用centos系统执行该命令时发现,对于cp命令,-f 参数貌似无效,而对mv和rm都有效
  • -i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行。(不带-f参数时相当于默认带了-i参数)

(2)文件移动 mv

可用于文件改名。

常用参数说明:

  • -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
  • -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

mv命令没有 -r 参数,但可以通过 * 进行全部移动。

(3)文件删除 rm

常用参数说明:

  • -r:删除目录,不带该参数时只能删除文件;
  • -f:强制执行,不带该参数时任何删除动作都需要用户输入y来确认。
  • -i:互动模式,在删除前会询问使用者是否动作

(4)文件远程复制 scp

语法:scp [参数] <file_source> <file_target>

举例:

  • scp local_file remote_username@remote_ip:remote_folder :指定用户名,需输入密码;文件名不变。
  • scp local_file remote_username@remote_ip:remote_file :指定用户名,需输入密码;指定文件名。
  • scp local_file remote_ip:remote_folder :没有指定用户名,需要输入用户名和密码,文件名不变。
  • scp local_file remote_ip:remote_file :没有指定用户名,需要输入用户名和密码,指定文件名。

常用参数说明:

  • -r: 递归复制整个目录。

6.文件搜索

(1)按照名称搜索 find

find命令是我们在Linux系统中用来进行文件搜索用的最多的命令,功能非常强大。但是我们要说的是尽量少用find命令去执行搜索任务,就算要搜索我们也应该尽量的缩小范围,也不要在服务器使用高峰期进行文件搜索,因为搜索也是很占系统资源的。这就需要我们在进行Linux文件整理的时候,尽量规范化,什么文件放在什么目录下都要有比较好的约定。

注意:Linux搜索和windows是有明显区别的,Linux严格区分文件大小写

语法:find【搜索范围】【匹配条件】

  • 根据文件或者目录名称搜索:find 【搜索目录】-name/iname【搜索字符】(-name和-iname的区别一个区分大小写,一个不区分大小写。)

find命令匹配条件必须加模糊搜索符号,否则只能精准搜索。而grep不需要模糊搜索符号。

find命令通配符:

  1. *:匹配任意内容
  2. ?:匹配任意一个字符
  3. []:匹配中括号内的任意一个字符

举例如下:

  1. find /etc -name init   (精准搜索,名字必须为 init 才能搜索的到)
  2. find /etc -name *init  (模糊搜索,以 init 结尾的文件或目录名) 
  3. find /etc -name init??? (模糊搜索,? 表示单个字符,即搜索到 init后有3位的文件或者目录)
  4. find /etc -name *[cd](模糊搜索,表示搜索以c或者d结尾的文件)
  • 根据文件大小搜索:find 【搜索目录】-size [+/-]<number> (+n 表示大于,-n 表示小于,n 表示等于)

1 数据块 == 512 字节 ==0.5KB,也就是1KB等于2数据块,100MB == 102400KB==204800数据块。

  • 根据所有者搜索:find 【搜索目录】-user <username>
  • 根据所属组搜索:find 【搜索目录】-group <groupname>
  • 根据时间属性搜索:find 【搜索目录】[-amin/cmin/mmin] [+/-]<n>(amin:访问时间,cmin:文件属性被修改时间,mmin:文件内容被修改时间;+n、-n、n分别表示超过n分钟,n分钟以内和n分钟。在 /etc 目录下查找5 分钟内被修改过内容的文件和目录:find /etc -mmin -5 。)
  • 根据文件类型搜索:find 【搜索目录】-type f/d/l(f表示文件,d表示目录,l表示软链接)
  • 根据i节点搜索:find 【搜索目录】-inum <inode_num>
  • 组合搜索:在上述搜索参数的基础上,-a  表示两个条件同时满足(and),-o  表示两个条件满足任意一个即可(or)。如查找/etc目录下大于80MB同时小于100MB的文件:find /etc -size +163840 -a -size -204800 。

补充:which、whereis命令都是搜索命令的可执行文件等内容,其他内容搜索还是要用find。如:whereis ls。

(2)按照文件内容搜索 grep

语法:grep [<参数>] <find_string> <filename>

  • -i:不区分大小写
  • -v:排除指定字符串。等于awk命令的 !~ 取反。

范例:查找 /root/install.log 文件中包含 mysql 字符串的行,并输出 grep mysql /root/install.log

同awk命令:awk '/mysql/' /root/install.log

7.列出当前系统打开的文件 lsof

lsof(list open files),用于查看进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP),找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行

在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

(1)输出信息含义

参数及输出信息参考https://blog.csdn.net/qq_27870421/article/details/92803453,但感觉没必要看这么详细。

[root@localhost~]# lsof
command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
migration     2 root  cwd       DIR                8,2     4096          2 /
migration     2 root  txt   unknown                                        /proc/2/exe
ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
  • COMMAND:进程的名称。
  • PID:进程标识符。
  • PPID:父进程标识符。(需要指定-R参数才会显示)
  • USER:进程所有者。
  • PGID:进程所属组。(也需要加参数)
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如:cwd当前工作目录,mem内存映射文件,mmap内存映射设备,txt应用文本(代码和数据),数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如下文的*ilege.ibd文件,其文件描述符为 175。u 表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。(参考:https://www.jianshu.com/p/f57114fadb85我们在定位问题过程中更多的是关注文件描述符为数值类型的文件

  • DEVICE:指定磁盘的名称。
  • SIZE:文件的大小。
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称。

(2)常用参数

  • 查看打开文件的进程:lsof <filename>
  • 递归查看某个目录的文件信息:lsof +D <filepath>/<filename>
  • 查看进程打开的文件:lsof -p <PID>(多个进程:lsof -p <PID1>,<PID2>,<PID3>)
  • 查看服务打开的文件:lsof -c <servicename>(多个服务:lsof -c <servicename1> -c <servicename2>)
  • 查看用户打开的文件:lsof -u <username>
  • 列出所有的网络连接:lsof -i
  • 查看端口的使用情况:lsof -i :3306(与netstat -tunpl | grep 3306的搜索结果近似)

补充:

  • 查看进程打开的文件(排除进程A):lsof -p ^<PID_A>
  • 查看服务打开的文件(排除服务A):lsof -c ^<servicename_A>
  • 查看用户打开的文件(排除用户A):lsof -u ^<username_A>

(3)使用实例:查看文件使用者

文件被使用导致删除失败时,可以通过lsof <filename>查看用户与进程。

(4)使用实例:"too many files"问题定位

  • 查看系统打开句柄最大数量:cat /proc/sys/fs/file-max
  • 根据打开文件句柄的数量降序排列:lsof | awk '{print $2}' | sort | uniq -c | sort -nr | more(补充2中写了我在网上找到的查看进程文件句柄数的另一种方法)
  • 根据进程ID查看详情:ps -ef | grep <PID>
  • 然后可以结合jstack命令查看线程及文件情况。

参数补充:

  • sort:排序。(-n 按照数值大小;-r 反序)
  • uniq:检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。(-c 在每列旁边显示该行重复出现的次数)
  • more:类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,最基本的指令就是按空白键(space)。

文件句柄数过多问题可以通过上述方法定位,如果需要修改句柄数限制,请参考补充1内容。

(5)使用实例:恢复删除的文件

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。

当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。

lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。 当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容

假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下: 首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:

# lsof |grep /var/log/messages
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted) 

从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:

# head -n 10 /proc/1283/fd/2 
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart. 
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started. 
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) 
#1 SMP Wed Jul 18 11:18:32 EDT 2007 
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: 
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) 
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) 
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) 
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) 
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) 
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved) 

从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。(咋看出来的,我没看出来哇???感觉写错了)如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如: cat /proc/1283/fd/2 > /var/log/messages。对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

二、目录管理

1.pwd:显示当前目录命令

2.cd:切换目录命令

3.mkdir:创建目录命令

常用参数如下:

  • -p :如mkdir -p aaa/bbb,如果上级目录不存在,加上-p参数会递归创建。
  • -m :配置文件的权限,如下

注意:

  • 只能创建目录,不能创建文件。
  • 创建的目录已经存在,那么 Linux 会提示无法创建。
  • 创建目录的首要条件是, 在想要创建目录的目标路径下你必须具有访问权限。

4.rmdir:删除空目录命令

  • 由于此命令只能删除空目录,在实际操作中应用的不多,通常使用 rm 命令替代。

三、补充

1.修改单进程最大文件连接数

遇到"too many files"问题,可以通过修改进程的最大文件连接数解决,编辑 /etc/security/limits.conf 文件。

  • 查看当前系统资源限制的设定:ulimit -a

补充:ulimit 显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。

更新系统限制(临时)

  • ulimit -u 2048(设置用户最大进程数)
  • ulimit -v unlimited(设置虚拟内存无限制)

小窍门:设置参数即 ulimit -a 命令打印出的括号中的参数。

补充:-h参数可指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限。

更新系统限制(永久)

  • 编辑 /etc/security/limits.conf 文件,添加如下的行:
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100

说明:* 代表针对所有用户,soft代表软限制,hard代表硬限制,noproc 是代表最大进程数,nofile 是代表最大文件打开数。

另外:同时需要注释掉下面方法文件中的对应设置。

  • 或者修改/etc/security/limits.d/xx-nproc.conf文件中的值。

小窍门:修改所有 linux 用户的环境变量文件,vi /etc/profile,添加ulimit -u 2048命令,保存后运行 source /etc/profile 使其生效,效果相当于永久哇。

2.查看某进程占用的文件句柄数和线程数

参考:https://jingyan.baidu.com/article/75ab0bcbc67b3fd6864db2cc.html

/proc/<PID>/ 目录下,fd 目录中的软连接文件数即为句柄数,task目录下的目录文件数即为线程数。

注意:fd目录中的句柄仅包含文件描述符为数值类型的文件,lsof命令查询到的结果还包含其他类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值