命令(二)文件、文件夹类

前言:整理一些我平时用到的命令,并不会很详细,但是很实用。

1. 查看文件夹结构

用途 命令 注释
查看文件夹结构(不显示隐藏文件) tree 需要安装tree:sudo apt-get install tree
查看文件夹结构(显示隐藏文件) tree -a
查看文件夹结构(只显示文件夹) tree -d
查看文件夹结构(显示指定文件夹) tree 目标文件夹 例如:tree mydir
查看一级目录文件结构 tree -L 1 后面加“-a”表示显示所有文件(包括隐藏文件)
在这里插入图片描述

2. 文件管理器命令

● 例:在终端中打开当前路径的文件夹

nautilus .

3. 查看文件夹大小

● 例1:显示当前文件夹大小(如果想列出当前目录下所有子目录,把深度设置为1)

du -h --max-depth=0

● 例2:显示指定路径文件夹或者文件大小

du -sh 指定路径文件夹/文件

● 例3:显示某个文件夹内所有一级目录的大小(不包含隐藏文件、文件夹)
在这里插入图片描述
● 例4:查看当前目录下所有隐藏文件及文件夹大小

du -sh .[!.]*

● 例5:du -sh配合sort排序

sun@sun-pc:~/project/AOSP$ du -sh ./* | sort -h
0	./Android.bp
0	./bootstrap.bash
0	./vbmeta.img.info
4.0K	./disregard
4.0K	./Makefile
...
1.9G	./frameworks
26G	./prebuilts
72G	./out

说明:
如果sort不加-h,则会出现4.0k在1.9G下面的情况,因为sort命令在默认情况下是依据第一列字符的ascii码进行排序,显然对du -sh输出的内容无法排序。
sort -h :使用易读性数字(例如: 2K 1G),其实就是在排序的时候也会考虑单位的因素。


4. 文件与文件夹权限

1.权限说明
linux文件系统中,文件或者文件夹有三组rwx权限,下面举例说明:

sun@sun-pc:~$ ls -l
rw-r-xr-x 1 sun sun    0 59 18:20 1.txt

从左往右数,三组权限分别代表:
(1) 该文件所属用户对该文件的权限,包括可读,可写,不可执行(rw-)
(2) 该文件所属用户组对该文件的权限,包括可读,不可写,可执行(r-x)
(3) 其他用户对该文件的权限,包括可读,不可写,可执行(r-x)

2.更改权限
使用命令chmod可以更改文件或文件夹权限,还是以上面的1.txt举例说明:

#为所属用户添加可执行权限
chmod u+x 1.txt

#为所属用户组添加可写权限
chmod g+w 1.txt

#为其他用户添加可写权限
chmod o+w 1.txt

#为所有用户添加写权限
chmod a+w 1.txt

#为所属用户和用户组添加写权限
chmod ug+w 1.txt

#为所属用户和用户组添加读写权限
chmod ug+rw 1.txt

除了上面的几种方法外,还可以直接用数字代表权限。- - -可以看成二进制数000,rwx看成二进制数111。在用chmod加权限的时候,把二进制数转换成八进制即可。需要注意的是,数字是完全代表了所有的权限,并不能单独追加某种权限,所以在更改权限时要注意按照实际需求计算好权限数字,避免将某个不想改的权限给误更改了。

#更改所属用户权限为r-x,用户组权限为--x,其他用户权限为rw-
chmod 516 1.txt

5. 查找文件

例:查找test.txt文件

5.1 locate

sun@sun-pc:~/myProjects$ locate /test.txt    #locate只能查找文件名包含test.txt的文件,所以这里加上路径分割符号“/”
/home/sun/Share/frameworks/base/tools/aapt2/integration-tests/App/assets/test.txt
/home/sun/Share/frameworks/base/tools/aapt2/integration-tests/App/assets/subdir/subsubdir/test.txt
/home/sun/Share/frameworks/base/tools/aapt2/integration-tests/App/assets2/test.txt
/home/sun/Share/frameworks/base/tools/aapt2/integration-tests/App/res/raw/test.txt
/home/sun/Share/frameworks/compile/mclinker/unittests/test.txt
/home/sun/test.txt

注:
(1) locate是从系统的信息库中查找某文件,速度较快,区分文件名的大小写。
(2) 如果确定有某文件,但是没有locate没有查到,应该是信息库没有更新导致的,执行下面命令进行更新信息库:

sudo updatedb       //一般时间较久,建议空闲时间执行

5.2 find

例1:查找test.txt文件

find -name "test.txt"

例2:查找test.txt文件的时候排除某个目录
使用-path 要排除的目录 -prune -o,如果要排除多个目录就多写几个这条语句即可

find ./ -path ./out -prune -o -name test.txt       //在当前目录下查找test.txt,查找的时候排除当前目录下的out目录

例3:找出A目录中与B目录中文件同名的文件

find A目录路径 -type f | sed 's/.*\///' | xargs -L 1 find -name

上面三个命令通过管道符号连接,分别解释一下:

  • find A目录路径 -type f
    找出A目录中所有的文件
  • sed ‘s/.*///’
    消除上个命令输出结果中的路径,只剩下文件名
  • xargs -L 1 find -name
    -L 1意思是每次取一行上个命令的处理结果,作为find -name的参数

例4:限制递归查找的层级
如果例3中,不进行递归子目录查找文件,可以使用-maxdepth 参数进行限制查找目录等级。
-maxdepth 0 代表0级目录,也就是不查找;
-maxdepth 1 代表一级目录,也就是目标路径的根目录;以此类推…

find A目录路径 -maxdepth 1 -type f | sed 's/.*\///' | xargs -L 1 find -maxdepth 1 -name

注:
(1) find命令是直接从磁盘中查找某文件,所以速度较慢。
(2) 有时候find在目录中递归查找某文件时,会出现“No such file or directory”这类的错误。如果不想看见这些错误信息,可以使用标准错误[2]配合重定向符[>]过滤掉错误信息:

find -name "test.txt" 2> /dev/null    //把错误信息输入到空设备中,注意2和>之间没有空格

6. 在文件中查找特定内容

● 例1:在camera目录的所有文件中(包含其所有子目录的文件),查找字符串name: “libhidlbase”

grep -r 'name: \"libhidlbase\"' ./camera

● 例2:在当前目录及子目录下后缀名是mk的文件中查找字符串name

grep -r "name" --include="*.mk" ./*

● 例3:列出本目录下所有的一级子目录

ls -l | grep ^'d'           //这个筛选原理是根据ls -l列出文件和目录的时候前边有类型符号,d开头的就是目录,-开头代表文件
参数 注释
-r 递归查找,默认不包括链接文件,除非在命令后面指定链接文件路径
-R 递归查找,包括链接文件
-n 显示行号
-l 排除二进制文件中的查找
–include= 表示在哪些文件中查找,包含多个文件时用{}把文件都括起来。注意这里的写法,是两个横杠后接"include=",并且等号前后不能有空格。(例如: –include={*.c,test.h}
–exclude= 表示不在哪些文件中查找,用法和–include=相同

注:
1.查找符号的时候需要在符合前面加转义字符\(例如: \" 代表 ")
2.查找反斜杠\,需要用三个反斜杠做转义符,如:grep -rn “\\\\”
2.只写-r而不指定查找范围时,默认查找当前所在目录,所以上面例二中./*可以不写

7. 文件压缩与解压

7.1 使用7z类型压缩包

压缩
● 例:把1.txt 2.txt 3.txt这三个文件压缩为test.7z文件

7z a test.7z 1.txt 2.txt 3.txt

解压
例:把test.7z文件解压

7z x test.7z
参数 注释
a 代表添加文件/文件夹到压缩包
x 代表解压缩文件,并且是按原始目录树解压
-o 是指定解压到的目录,-o后是没有空格的,直接接目录

7.2 使用tar类型压缩包

压缩:

tar -zcvf test.tar.bz2 1.txt 2.txt

解压:

tar -zxvf test.tar.bz2
参数 注释
-c 代表创建压缩文件
-x 代表解压缩文件
-t 查看压缩包里面的文件
-z 用 gzip 压缩/解压缩
-j 用 bzip2 压缩/解压缩
-v 显示压缩/解压缩的进度条
-f 使用档名(注意:f后面不要接参数,-zxfv是不对的,要写成-zxvf)

7.3 使用rar类型压缩包

压缩:

rar a test.rar 1.txt 2.txt

解压:

unrar e test.rar   //把压缩包里所有的文件都解压到当前目录
unrar x test.rar   //把压缩包正常解压到当前路径

7.4 使用zip类型压缩包

压缩:

zip -r test.zip 1.txt 2.txt

解压:

unzip test.zip

8. 文件系统挂载与卸载

简单说一下什么是挂载,挂载就是指将设备文件和操作系统里的文件夹进行绑定,这样就可以通过访问这个文件夹进行访问设备信息。正常情况下设备连接到操作系统后,操作系统会自动进行挂载,比如我们正常往电脑上插入U盘,系统会自动挂载并出现个磁盘分区,这样我们就可以对U盘进行读写等操作了。而在一些特殊情况下,需要开发人员手动进行挂载和卸载,这时候就需要mount和umount命令了。

挂载命令基本格式:mount [-t vfstype] [-o options] device dir

● 例1:将设备/dev/sdb1挂载到/mnt目录下

mount /dev/sdb1 /mnt              //这里没有指定vfstype,因为系统会自动匹配合适的文件系统类型

● 例2:将/system挂载的设备重新挂载并改为可读写的状态

mount -o remount,rw /system          //这里使用"-o"指定了两个选项(remount和rw),选项之间用逗号分隔开

● 例3:卸载例1中的/dev/sdb1

umount -v /dev/sdb1   或者     umount -v /mnt                 //两种方式都可以,-v表示执行时显示详细信息

注:
1.挂载和卸载结果可以通过命令df -ah进行查看
2.有时因为某进程正在使用该设备,导致该设备不能卸载,此时可以执行下面命令查看占用进程,并使用kill命令杀掉该进程

fuser -m /dev/sdb1

9. 标准输入输出

tee:读取标准输入的内容并输出到标准输出和文件
例:在命令行下将内容“deb [trusted=yes] http://10.1.1.4/debian ./”填写到sources.list文件的末尾,并将执行结果重定向到空设备中

echo "deb [trusted=yes] http://10.1.1.4/debian ./" | tee -a /etc/apt/sources.list > /dev/null

注:-a选项代表附加到给定文件,但不要覆盖

10. 查看文件信息

10.1 ls指令

命令 含义
ls 列出当前目录下所有可见文件及目录清单
ls -l 以列表形式列出当前目录下所有可见文件及目录清单
ll 以列表形式列出当前目录下所有可见文件及目录清单,包含./及…/
ls -lt 以列表形式列出当前目录下所有可见文件及目录清单,按时间降序排序显示
ls -lrt -r代表是逆序,与ls -lt排序相反
ls -F 区分显示,不同类型显示特点不同
普通文件: 白色,无任何特殊符号.
链接文件: 天蓝色,末尾带有@
文件夹: 蓝色,末尾带有 /
有执行权限的文件: 绿色,末尾带 *

在这里插入图片描述
在这里插入图片描述

扩展:
删除本目录下所有的子目录

sun@sun-pc:~/temp$ ls -F | grep /$ | xargs rm -rv
removed directory 'test1/'
removed directory 'test2/'
removed directory 'test3/'
removed directory 'test4/'

10.2 stat指令

在这里插入图片描述

11. 输出文件内容到终端上

cat filename                              #将文件filename的内容输出到终端上
cat filename | grep xxx                   #筛选包含字符串"xxx"的内容到输出到终端上
cat filename | grep xxx -n                #输出包含字符串"xxx"的行数到终端上
cat filename | tail -n 10                 #输出的最后10行内容
cat filename | head -n 10                 #输出的头10行内容
cat filename | tail -n +10                #输出第10行及以后的内容
cat filename | tail -n +10 | head -n 20   #输出第10~20行内容

12. 文件复制命令cp

大家都熟悉拷贝命令cp,介绍一下特殊用法,如下
● 例1: 将main.mk分别拷贝到a/build/make/core/b/build/make/core/

echo a/build/make/core/ b/build/make/core/ | xargs -n 1 cp -v main.mk

注解:
echo:这里的作用就是将目标目录打印出来,供xargs使用
xargs -n 1 :限制每个命令的参数最大为1个,并将参数传给cp命令
cp -v:-v的意义就是拷贝的时候显示详细信息

● 例2:将多个文件(1.txt,2.txt)拷贝到/home/user/temp

cp 1.txt 2.txt /home/user/temp

● 例3:除了1.txt以外,将当前路径下的所有文件和目录拷贝到/home/user/temp

cp -rf !(1.txt) /home/user/temp

#扩展:上面是排除1.txt一个文件,排除多个文件如下
cp -rf !(1.txt|2.txt) /home/user/temp

猜你喜欢

转载自blog.csdn.net/In_engineer/article/details/127503593