Linux | 文件目录操作

362 阅读8分钟

一、查看文件

cat 一次性输出文件内容,正序的
tac	一次性输出文件内容,倒序的
cat -n filename	显示行号
(文件太大时,不建议使用该命令)

nl = cat -n 

head    只显示头几行
tail    只显示最后几行
head -n filename 只显示前n行
tail -n filename 只显示最后n行

more	适当的输出文件内容(不支持上下键)
“回车键”向下翻行,用“空格键”向下翻页;
Ctrl f 向下滚动一屏;
Ctrl b 返回上一屏; 
= 输出当前行的行号;
v 调用vi编辑器;

less	上下键翻页
//more是直接在当前界面输出,less是进入了一个类似编辑的界面,可以退出的。
less 进入界面后,按/可以进行字符匹配
n : 向前查找下一个匹配的文本
N : 向后查找前一个匹配的文本
//动态查看日志文件常用的命令非 tail -f 莫属,其实 less 也能完成这项工作,使用 F 命令

二、编辑文件

//vim大法
//非编辑模式下
dd 删除行
u   撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作
gg dG清空内容(gg的意思是光标切换到第一行 )

快速移动光标
先输入数字,表示移动几行,如10
k是行上移
j是行下移
w是前进几个单词
b是后退几个单词

三、文本分析

grep:用于查找文件里符合条件的字符串。(可以正则匹配)
如:以下容器信息,可以根据镜像或者容器名查找出来——docker ps | grep mysql

ac0f8fdc24e5        mysql:latest                  "docker-entrypoint.s…"   12 hours ago        Exited (255) 10 hours ago   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

awk:是一种处理文本文件的语言,是一个强大的文本分析工具。
能够将文本的每行,按列分割;
如:上述例子
docker ps -a | awk '{print $1}'就可以输出第一列,也就是容器id

grep和awk结合,就可以筛选出特定的行,以及行中特定的列;
如:根据容器名——获取容器id——删除容器
或:根据容器的镜像名——获取容器id——删除容器

四、移动和复制文件目录

1、复制文件夹
cp -rf /home/liuxiansheng/桌面/note_dir/ ./git仓库/mynote/
	-f 强制覆盖同名文件
	-r  按递归方式保留原目录结构复制文件

假设复制源目录 为 dir1 ,目标目录为dir2。怎样才能将dir1下所有文件复制到dir2下了
如果dir2目录不存在,则可以直接使用
cp -r dir1 dir2
即可。
如果dir2目录已存在,则需要使用
cp -r dir1/. dir2
如果这时使用cp -r dir1 dir2,则也会将dir1目录复制到dir2中,明显不符合要求。

2、重命名文件/目录
mv oldfilename newfilename	修改文件名
mv firoldname newdirname	目标目录不存在,则修改目录名;存在,则将源目录移动到目标目录
mv filename dirname		将文件移动到目录
mv dirname filename		错误!

3、~是用户的主目录

五、压缩与解压

1、ZIP(压缩率不是很高)
压缩:zip -r archive_name.zip directory_to_compress
解压:unzip archive_name.zip

2、TAR(只是一个打包工具,并不负责压缩)
压缩:tar -cvf archive_name.tar directory_to_compress
解压:
tar -xvf archive_name.tar.gz
tar -xvf archive_name.tar -C /tmp/extract_here/	

3、TAR.GZ(压缩时不会占用太多CPU)
压缩:tar -zcvf archive_name.tar.gz directory_to_compress
解压:
tar -zxvf archive_name.tar.gz	//解压在当前目录
tar -zxvf archive_name.tar.gz -C /tmp/extract_here/		//-C指定解压的目的目录

4、TAR.BZ2(压缩率最好)
压缩:tar -jcvf archive_name.tar.bz2 directory_to_compress
解压:tar -jxvf archive_name.tar.bz2 -C /tmp/extract_here/

六、文件权限

1、权限设置

chmod u+x,g+w file # 为文件file设置自己可以执行,组员可以写入的权限
chmod u=rwx,g=rw,o=r file
chmod 764 f01
chmod a+x f01      # 对文件file的u,g,o都设置可执行属性

+  # 权限操作符,添加某些权限
-  # 权限操作符,取消某些权限
=  # 权限操作符,设置文件的权限为给定的权限

2、权限组合

任何权限组合都可从0(没有权限)~7(完全权限)中得到;
递归处理,将指令目录下的所有文件及子目录一并处理;

r 读取权限,数字代号为“4”;
w 写入权限,数字代号为“2”;
x 执行或切换权限,数字代号为“1”;
-不具任何权限,数字代号为“0”;
7代表可读可写可执行

3、操作对象

u  # 操作对象简称,用户user,文件或目录的所有者。
g  # 操作对象简称,同组用户group,文件或目录所属群组
o  # 操作对象简称,其它用户others
a  # 操作对象简称,所有用户all,系统默认使用此项

七、查看文件目录大小

du dir_name | sort -nr		//查看子目录大小,从大到小排列
du -sh 			//查看当前目录大小
df -h 			//查看分区大小
df -i 			//查看inode数量
du -sh *		//查看当前目录下每个文件的大小
du -sh /*		//查看根目录下每个目录的大小(/home/etc)

lsof(list open files)命令是一个列出系统当前打开的文件的工具。
lsof 常见的用法是查找应用程序打开的文件的名称和数目。比如出现too many open file时,排查程序。

1、什么是inode

inode包含文件的元信息
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置

stat filename/dirname	//可以查看文件、目录的inode信息
df -i //查看每个硬盘分区的inode总数和已经使用的数量
dumpe2fs -h /dev/hda | grep "Inode size" //查看分区每个inode节点的大小

2、inode大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。**inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。**假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

(1)由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

error:No space left on device

(2)有时候会出现磁盘没满,inode也还有剩余,但就是No space left on device

可能原因:有些文件删除时还被其它进程占用,此时文件并未真正删除,只是标记为 deleted,只有进程结束后才会将文件真正从磁盘中清除。

3、inode码号

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

ls -i filename	查看文件的inode号码

目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

4、硬链接

在linux中,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

//创建硬链接
ln 源文件 目标文件

创建目录时,默认会生成两个目录项:"."和".."。

前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";

后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。

所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。

5、软连接

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,**如果删除了文件B,打开文件A就会报错:"No such file or directory"。**这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

//创建软连接
ln -s 源文文件或目录 目标文件或目录

//执行ls -l,就可以看见软连接的指向 

6、inode的特殊作用

  • 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  • 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  • 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。