本篇为校内选修课教授内容的私人学习笔记,仅供在此博客网站观看,可分享此文链接给你需要分享的人,但暂时不开放转载权限,侵权必究,敬请理解。

文件和目录

文件系统的层次结构

Linux文件系统的结构层次.png

Linux中的标准系统目录

Linux中的标准系统目录.png

默认登录后一开始都在~$,即/home/你的用户名目录下,也叫“家目录”或“用户的主目录”
cd命令全称change directory,用于更改当前目录,进入想进的目录,如:
cd /指改变目录到/去,所有文件都是从根目录开始的
ls命令指查看当前目录
ls /l指查看属性:权限、创建时间、大小等
cd -指返回原文件(Linux中没有盘符,所有目录全都看成文件)
pwd指显示当前路径

文件系统的概念

  • 文件系统:磁盘上有特定格式的一片区域
  • 文件:存储数据的一个有名字的对象
  • 目录:包含许多文件项目的一类特殊文件
  • 子目录:被包含在另一个目录中的目录
  • 父目录:包含子目录的目录称为父目录
  • 文件名:用来标识文件的字符串,保存在一个目录文件项中
  • 路径名:由/字符结合在一起的一个或多个文件名的集合,它指定一个文件在文件系统中的位置,如/home/nic/hmli/.bashrc(第一个/指根目录,后面的作为分隔符)

文件名称

  • 包含大写字母、小写字母、数字、$@_
  • 一般不包含以下字符:*?></;$@~(特殊字符导致难于访问这些文件)
  • 最好不以+开头
  • 最长文件名255字符
  • 可以有扩展名以便于识别和管理,扩展名与实际类型无关,用扩展名作为文件名的一部分,中间用.隔开
  • 区分大小写

平时自己命名文件不要以-开头,如果遇到想要删除这种文件,要特殊处理
访问以开头的文件,比如删除‘-foo’可以使用以下方法之一:

  1. rm␣−−␣−foo(加两个横杠)
  2. rm␣ ./−foo(加点和斜杠)

rm是删除命令,
在使用cpmv等许多命令时遇到此类文件名可类似处理

文件的主要类型

主要有以下文件类型,利用ls ␣−l输出对应文件名的行第一个字符可判断
-l相当于ls的参数,所以中间要加个空格

1) 普通文件:
  • 文本文件:ASCII码形式存储,以-开头,如:
    −rw−r−−r−− 1 root root 39599 Mar 8 12:15 x.sh
    最后的x.sh是它的名称,前面那一堆是它的属性:权限、大小、创建时间等
  • 二进制文件:以二进制形式存储在计算机中,不可直接读,要通过相应的软件读取,以-开头,如:
    −rw−r−−r−− 1 root root 69599 Mar 8 12:25 x
2) 目录文件:

以d开头,如:
drwxr−xr−x 2 root root 4096 Aug 2 2006 bin
最前面加个d代表它不是个文件,而是个目录,下面还有其他东西,相当于是个文件夹

3) 设备文件:
  • 块设备文件:以b开头,如:
    brw−rw−−−− 1 root disk 3, 1 Jan 30 2003 /dev/hda1
    前面的b就指的是设备,比如硬盘、U盘、光驱等
  • 字符设备文件:以c开头,如:
    crw−−−−−−− 1 root root 4, 1 Jul 31 13:49 /dev/ tty1
    前面的c指外加的一些设备
4) 链接文件:

存放文件系统中通向文件的路径,以l开头,如:
lrwxrwxrwx 1 root root 11 Sep 30 2008 c −> /mnt/c
前面l开头的指超链接文件,不是真正的文件,点击会跳转到其他地方,类似于Windows上的快捷方式

路径的名称

主要分为两种类型:

  • 绝对路径,如/home/hmli/linux,以/~开头
  • 相对路径,如当前目录为./home/hmli,那么linux即是相对路径,不以/~开头

/是根目录,~是家目录
绝对路径相对于根
相对路径相对于当前目录的父目录
这和HTML中是一样的概念


目录操作命令

  • ls:显示目录中的内容
  • pwd:显示当前工作目录
  • cd:改变用户工作目录
  • mkdir:建立用户目录
  • rmdir:删除目录

列出目录内容:ls

ls命令列出一个子目录中的全部文件和目录名,一般格式为:
ls ␣ [OPTION]...␣[FILE ]...
ls有很多参数,在Linux系统中只要有不会的,可以输入-help,所有的就出来了
它有多个命令行参数,参数可组合使用,下面列出它最常用的几个

  • -a:显示所有文件或目录(all的缩写),包括以“.”为名称开头字符的隐藏文件、现行目录“.”与上层目录“..”
  • -l:使用详细格式列表。将权限标示、硬件接数目、拥有者与群组名称、文件或目录大小及更改时间一并列出
  • -R:递归处理,将指定目录下的所有文件及子目录一并处理
  • -t:按照时间排序
  • -S:按照大小排序
  • -r:逆向排序
  • –color[=WHEN]:对不同类型的文件显示不同的颜色,WHEN默认为always,可为never和auto

ls举例:
使用长列表方式列出某个子目录中的全部文件:
ls ␣−la(参数l和a可以一起组合用,这也是Linux系统的方便之处)

1
2
3
4
5
total 16
drwxr−xr−x 4 root root 4096 Jan 1 11:28 .
drwxr−x−−− 11 root root 4096 Jan 1 11:27 ..
drwxr−xr−x 2 root root 4096 Jan 1 11:27 dir1
drwxr−xr−x 2 root root 4096 Jan 1 11:28 dir2

列出子目录中以字母v打头的全部非隐藏文件:
ls ␣ /boot/v*

1
2
−rw−r−−r−−  1  root  root  2706672  Oct  8  05:42  /boot/vmlinuz−3.0.0−2−amd64
−rw−r−−r−− 1 root root 2496704 Oct 9 07:55 /boot/vmlinuz−3.0.0−5−hmli−amd64

显示当前工作目录:pwd

pwd没有参数,唯一的作用就是显示当前工作目录的绝对路径的名称

1
/ home / hmli

环境变量PWD存储当前目录名,OLDPWD存储执行cd命令切换到当前目录之前的目录名,利用echo可以查看,如:
echo␣$PWD
echo␣$OLDPWD

echo是一个很常用的命令,是查看、屏幕输出。
这里的$指的是一个变量符号,和用户名后的不一样。
用户名后的那里的$指普通用户,不是root用户。

改变用户工作目录:cd

cd命令可让用户在不同目录间切换,一般格式为cd ␣ [−L|[−P]␣[dir ]
几个常用方式:

  • cd ␣ dirname:进入名字为dirname的目录
  • cd ␣~username:进入用户username的主目录
  • cd ␣~/dirname:进入当前用户的主目录下的dirname子目录
  • cd ␣−:返回进入这个目录之前所在的目录
  • cd ␣ .. :进入上一级目录
  • cd ␣ ../.. :进入上两级目录
  • cd ␣ ../ subdir / subsubdir:进入上级目录下的subdir下的subsubdir目录
  • cd:不跟任何参数时返回用户根目录

建立用户目录:mkdir

mkdir可建立目录,一般格式为:
mkdir␣ [OPTION]...␣DIRECTORY...
主要选项为:

  • -p:若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录,如mkdir␣−p␣1/2将建立目录1/2,如果目录1不存在,那么也会一起建立
  • -m:建立目录时,同时设置目录的权限。权限的设置法与chmod命令相同,如mkdir␣−m␣700␣3

删除目录:rmdir

rmdir命令可删除空目录,若所要删除目录非空,则出错

  • rmdir ␣ dirname:删除dirname目录
  • -p:删除指定目录之后,若该目录的上层目录已变成空目录,则将
    其一并删除,如rmdir ␣−p␣1/2
  • rmdir更常用的替代命令为后面所说的rm命令

文件操作命令

这里不仅仅指的是普通文件,也包括目录等文件

  • cp:复制文件或目录
  • mv:移动文件和文件换名
  • rm:删除文件或目录
  • ln:在文件间建立连接(类似Windows的快捷方式)
  • find:查找特定的文件
  • locate:定位查找特定的文件
  • where:查找文件
  • which:查看命令的路径
  • touch:改变文件的时间参数

复制文件或目录:cp

cp命令用来复制文件,在缺省的情况下,工作时不做任何显示,只有在
出现错误情况的时候才显示状态信息,一般格式为:
cp ␣ [OPTION]...␣SOURCE␣DEST

cp-help可列出它的选项

主要选项:

  • -a:复制时尽可能保持文件的结构和属性
  • -f:不提示直接覆盖存在的目标文件
  • -i:覆盖现存文件时提示,建议打开此选项,避免误操作覆盖掉原目标文件
  • -p:保持原始文件的所有者、组、许可和时间表属性
  • -r:递归地复制目录

举例:

  • 复制源文件srcfiledestfile
    cp ␣ srcfile ␣ destfile
  • 保留文件的结构和属性复制源目录/home/hmli/srcdir到当前目录下的destdir目录:
    cp ␣−a␣ /home/hmli/ srcdir ␣ destdir

移动/重命名文件:mv

mv命令用来把文件从一个位置移动到另外一个位置,一般格式为:
mv␣[OPTION]...␣SOURCE␣DEST
主要选项:

  • -i:覆盖现存文件时提示,建议打开此选项,避免误操作覆盖掉目标
    文件
  • -f:不提示直接覆盖存在的目标文件

删除文件或目录:rm

删除了后基本不存在恢复的可能,小心

rm命令用来删除文件,一般格式为:
rm␣[OPTION]...␣FILE...

主要选项:

  • -f:不提示直接删除指定的目标文件
  • -i:指定交互模式,在执行删除前提示确认
  • -r:删除文件列表中的目录

删除文件名以-开头文件,比如‘-foo’可以使用以下方法之一:

  • rm␣−−␣−foo
  • rm␣ ./−foo

注:在使用cpmv等许多命令时遇到此类文件名可类似处理

在文件间建立连接:ln

软连接,可以理解成指针,更形象点可以理解成快捷方式。

ln命令用来建立硬连接和符号连接

  • 硬连接是一个文件的额外的名字,相当于一个同步更新的副本,删除源文件,硬连接的内容还存在
  • 符号连接相当于快捷方式,当源文件被删除后,符号连接仍然存在,
    但链接的内容已经不存在

一般格式为:
ln ␣ [ options ] ␣ source ␣ [ dest ]
主要选项:

  • -d:用于建立目录的硬连接,默认选项
  • -f:覆盖已存在的目的文件
  • -i:提示是否覆盖已存在的目的文件。
  • -s:建立符号连接而不是硬连接

查找文件:find

find命令可以根据各种检索条件查找文件,一般格式为:
find ␣ [−H]␣[−L]␣[−P]␣[−D␣debugopts]␣[−Olevel]␣ [path ...] ␣ [ expression ]

  • path…:准备寻找文件所在的路径及它的子路径,也可是多个路径
  • expression:包含要搜索文件的条件,可以包含文件名、拥有者、修改时间、权限等

find主要选项:

  • -atime n:至少n*24小时内没有访问过的文件
  • -ctime n:至少n*24小时内没有修改过的文件
  • -amin n:n分钟之内没访问过的文件
  • -cmin n:n分钟之内没修改过的文件
  • -empty:文件为空
  • -name name:指定要寻找的文件或目录的名称,区分大小写
  • -iname name:指定要寻找的文件或目录的名称,不区分大小写
  • -type c:以文件的类型作为寻找的条件,若c为:
    • d:表示寻找目录
    • f:表示寻找普通文件
    • c:表示寻找字符特殊设备
    • b:表示寻找特殊块设备
    • p:表示寻找命名管道
    • l:表示寻找符号连接
    • s:表示寻找套接字(socket)

find举例:

  • 查找/home子目录中至少7天没有被访问过的文件:
    find ␣ /home␣−atime␣+7␣−print
  • 找出/usr/src子目录中名字为core.*的文件并删除它们:
    find ␣ / usr/ src ␣−name␣core.*␣−exec␣rm␣{} ␣ \;
  • 找出/home中以.jpg结尾并且长度超过100KB的文件:
    find ␣ /home␣−name␣"*.jpg"␣−size␣+100k
  • 找出当前目录下权限不是755的目录并将其权限设置为755:
    find ␣ . ␣−type ␣ d ␣ ! ␣−perm␣755␣−exec␣chmod␣755␣{}␣ \;

注意:结合-exec选项时一定要小心,特别是后面跟rm等命令时

查找文件所在目录:locate

从系统保存文件位置信息的数据库中搜索文件:locate
如查看名字中含有libmkl_intel的库文件:locate ␣ libmkl_intel

1
2
3
4
5
6
w a r ni n g : l o c a t e : w a r ni n g : d a t a b a s e / v a r / l i b / s l o c a t e / s
l o c a t e . db ’ i s more t h a n 8 d a y s ol d
/ o pt / i n t e l / C om pil e r / 1 1 . 0 / 0 8 3 / mkl / l i b / 3 2 / l i b m k l _ i n t e l . a
/ o pt / i n t e l / C om pil e r / 1 1 . 0 / 0 8 3 / mkl / l i b / 3 2 / l i b m k l _ i n t e l . s o
/ o pt / i n t e l / C om pil e r / 1 1 . 1 / 0 5 9 / mkl / l i b / 3 2 / l i b m k l _ i n t e l . a
/ o pt / i n t e l / C om pil e r / 1 1 . 1 / 0 5 9 / mkl / l i b / 3 2 / l i b m k l _ i n t e l . s o

注意:

  • 如果系统的数据库不够新,那么查找的结果将未必正确,比如上面提示数据库的信息至少已经8天没更新
  • root可以运行updatedb更新数据库,普通用户无权更新

显示命令的路径:which

which查看命令的所在路径,如查看使用的是哪个mpif90:
which␣mpif90

1
/ o pt / openmpi − 1 . 4 . 3 / bi n / m pi f 9 

which实际上是在环境变量PATH中指定的路径中显示第一个搜索到的命
令的路径,利用echo␣$PATH可以看到以:分隔的命令路径,如:

1
/ u s r / l o c a l / bi n : / u s r / bi n : / bi n : / o pt / openmpi − 1 . 4 . 3 / bi 

改变文件的时间参数touch

touch改变文件访问和修改时间或用指定时间建立新文件,一般格式为:
touch ␣ [OPTION]...␣FILE...
主要选项:

  • 不带参数:将文件的时间改为当前时间
  • -a:只更改访问时间
  • -c:若目标文件不存在,不建立空的目标文件
  • -t [[CC]YY]MMDDhhmm[.ss]:以指定时间修改文件的时间,如下述
    命令将文件file1的时间修改为1月20日15点30分:
    touch ␣−t ␣ 01201530␣ file1

显示文件内容的命令

  • cat:显示和合并文件
  • paste:横向合并文件,将多个文件对应行合并
  • more:分屏显示文件
  • less:分屏显示文件
  • head:显示文件的前几行
  • tail:显示文件的最后几行

显示和合并文件:cat

cat可以结合多个文件,并将它们的内容输出到标准输出设备或者定向到
某个文件,一般格式为:
cat ␣ [OPTION]...␣[FILE ]...
主要选项:

  • -b:列出文件内容时,在所有非空白列开头标上编号,从1开始累加
  • -E:在每一行的最后标上“$”符号
  • -n:列出文件内容时,在每一行开头标上编号,从1开始累加

cat举例:

  • cat命令从标准输入设备(如键盘)读取数据,转而输出至标准输出设备(如显示器):
    cat不加任何参数之后回车,键入文字,按下回车键,系统将回应一模一样的文字
  • 将屏幕输入定向到file2中:
    cat ␣>␣ file2
    输完后按<ctrl−d>终止输入,就将屏幕输入的存到文件file2中
  • 利用重定向符>将名称为file1与file2的文件合并成一个文件file3:
    cat ␣ file1 ␣ file2 ␣>␣ file3
    • >表示覆盖,若文件file3已经存在,则其内容会被覆盖
    • >>表示追加,若用>>代替>,新的内容就会追加在原有内容之后,
      而不会覆盖它

横向合并文件:paste

paste横向合并文件,将多个文件对应行合并,一般格式为:
paste ␣ [OPTION]...␣[FILE ]...
一般选项:

  • -d, –delimiters=LIST:用LIST代替TABs
  • -s, –serial:串行而非并行合并文件

例如:

1
2
3
4
file1的内容如下: file2的内容如下:
1 a
2 b
3 c

执行paste ␣ file1 ␣ file2 将显示:

1
2
3
1 a
2 b
3 c

分屏显示文件:more

more可将文件内容显示于屏幕上,每次只显示一页。可以往下翻页,但
无法回退翻页,一般格式为:
more␣[−dlfpcsu] ␣ [−num]␣[+/pattern] ␣ [+linenum]␣[ file ␣ ...]
主要选项:

  • +/<字符串>:在文件中查找选项中指定的字符串,然后显示字符串所在该页的内容
  • +<行数>:从指定的行数开始显示
  • -n:每次只显示n行
  • -c:不滚屏,在显示下一屏之前先清屏

more启动后的主要操作:

  • 空格:翻页
  • /pattern:查找匹配pattern的字符
  • v:调用编辑器进行编辑
  • <ctrl-L>;刷新屏幕
  • q:退出

more举例:

  • 在文件file1中查找“123”字符串,然后从该页开始显示内容:
    more␣+/123␣ file1
  • 显示文件file1的内容,每10行显示一次,且在显示之前先清屏:
    more␣−c␣−10␣ file1

分屏显示文件:less

  • less类似more,也可以用来浏览超过一页的文件
  • less命令除了可按空格键向下显示文件外,还可利用上下键来卷动文件
  • 当要结束浏览时,只要下按q键即可
  • 显示中按v,也可调用编辑器直接进行编辑

建议使用功能更强大方便的lessmanless仔细看看用法以及功能

显示文件的前几行:head
head显示指定文件的开头若干行,默认值是10行,一般格式为:
head␣[OPTION]...␣[FILE ]...

  • -c N:显示前N个字节
  • -n N:显示前N行
  • -N:显示前N行,如:
    head␣−20␣ file

显示文件的最后几行:tail
tail 显示指定文件的末尾若干行,默认值是10行,一般格式为:
tail ␣ [OPTION]...␣[FILE ]...
主要选项:

  • -c N:显示后N个字节
  • -n N:显示后N行
  • -N:显示后N行
  • -f:连续监测需要显示文件的最后几行,如果文件更新,将自动显示出更新,常用于监测输出日志,比如:
    tail ␣−f ␣myjob.log

比较文件内容命令:comm与diff

  • comm:比较两个已排过序的文件
  • diff :比较文件的差异

显示两个文件共同部分:comm

comm用来对两个已排过序的文件进行逐行比较显示其共同部分,一般格式为:
comm␣[OPTION]...␣FILE1␣FILE2
OPTION可以为:

  • -1:不显示只在第一个文件里出现的行
  • -2:不显示只在第二个文件里出现的行
  • -3:不显示在第一、二个文件里都出现的行

comm举例:

1
2
3
4
5
ile1的内容如下:                file2的内容如下:
main ( main (
{ {
printf("Hello!\n"); printf("Good!\n");
} }

用comm命令对这两个文件进行比较只显示它们共有的行:
comm␣−12␣file1 ␣ file2

1
2
3
main (
{
}

显示多个文件不同部分:diff

diff 可以比较多个文本文件,并显示它们的不同,一般格式为:
diff ␣ [OPTION]...␣FILES
主要选项:

  • -c:输出格式是带上下文的三行格式
  • -C n:输出格式是带上下文的n行格式
  • -r:两个文件都是目录时,递归比较找到的各子目录
  • 输出的一般形式如下:
    • n1 a n3,n4
    • n1,n2 d n3
    • n1,n2 c n3,n4
  • a-附加,d-删除,c-修改
  • a、d、c前面的n1等表示第一个文件的行号,后面的n3等表示第二个文件的行号

上面的n1 a n3,n4表示两个文件若要变成相同,那么第一个文件的n1行将附加第二个文件的行号为n3到n4行之间的内容

diff举例:

1
2
3
4
5
6
7
file1的内容如下:           file2的内容如下:
main() main()
{ {
printf("Hello!\n"); int n,m;
} n=10;
printf(”%d\n”,m=n*10);
}

输入命令:
diff ␣ file1 ␣ file2
将显示:

1
2
3
4
5
6
7
8
9
3 , 5 c 3 , 6
<3 p r i n t f ( ” H ell o ! \ n ” ) ;
<4 }
<5
−−−
>3 i n t n ,m;
>4 n = 1 0;
>5 p r i n t f (”%d \ n ” ,m=n * 1 0 ) ;
>6}

文件权限操作

  • chmod:改变文件或目录的许可权限
  • chown:改变文件的所有权
  • chgrp:改变用户分组

文件的保护和权限

ls ␣−l显示的文件权限格式

1
2
d rwx r−x r −x 2 hmli hmli 4096 10月 19 2 3: 2 5 e xam ple
−rw−r −−r −− 1 hmli hmli 441611 10月 20 0 9: 0 1 f i l e . e p s

drwxr-xr-x和-rw-r–r–的组成:第一列为文件类型标记,接着的三列为用户权限
位,之后的三列为组权限位,最后三列为组外用户权限位
文件权限:

1
2
rwx     rwx     rwx
user group other
  • 普通文件:
    • r:可以查看文件内容
    • w:可以修改文件内容
    • x:可以执行文件
  • 目录:
    • r:可以查看目录下的文件
    • w:可以在目录下创建和删除文件
    • x:可以进入目录或访问目录下的文件

权限

权限格式,可以为二进制、八进制或字符形式,如

user group others
字符 rwx rw- r–
二进制 111 110 100
八进制 7(4+2+1) 7(4+2+1) 4(4+0+0)

多数文件的权限为:

  • 文件:−rw−r −−r −− 644
  • 目录:d rwx r−x r −x 755

改变文件权限:chmod

chmod用于改变文件或目录的权限,一般格式为:
chmod␣[OPTION]...␣MODE[,MODE]...␣FILE...
MODE模式:

  • u:文件所属帐户
  • g:文件所属组
  • o:不同组的帐户
  • a:所有帐户
  • +:添加权限
  • -:去除权限
  • =:使得指定文件只具有这些权限

主要选项:

  • -v:详细显示权限改变的信息
  • -c:类似-v,仅权限改变时显示
  • -R:对所有某目录下的文件进行递归处理

chmod举例:

  • 使文件file各用户都拥有完全权限:
    chmod␣777␣ file
  • 允许所有人读file,但只有拥有者能改变它:
    chmod␣644␣ file
  • 给所有人增加写权:
    chmod␣a+w␣file
  • 对组级和其他用户除去写权和读权:
    chmod␣o−wr,g−wr␣file
  • 建立其他用户的只读权:
    chmod␣o=r␣ file

注意控制权限,尽量不要给其他用户修改删除文件等权限

设置缺省权限:umask

利用umask可以设置新生成的文件和目录的缺省权限,但不影响已经存在的文件或目录权限,一般格式为:
umask␣[−p]␣[−S]␣ [mode]
mode与chmod的类似,应该设其mode为ls看到的权限的异或,简单说就是777−ls显示的
如避免其他用户查看自己新建的文件,可用umask␣077,将设置缺省权限为:

  • 文件:−rw−−−−−−− 600
  • 目录:drwx−−−−−− 700

如想要每次登录都起作用,需要加入shell的启动初始文件,比如bash的~/.bashrc

改变文件的所有权:chown

只有root用户能够进行这样的操作

chown可把一个文件的所有权修改为其他用户的,一般格式为:
chown␣[OPTION]...␣[OWNER][:[GROUP]]␣FILE...
主要选项:

  • -v:详细显示所有权的变化
  • -c:类似-v,仅所有权改变时显示
  • -R:递归改变目录及其内容的所有权
    比如,将所有文件的所有者修改hmli及其所在的组nic:
    chown␣−R␣hmli:nic ␣ dirname

改变文件的用户组:chgrp

只有root才可以执行

chgrp命令可以改变一个文件的用户分组设置情况,一般格式为:
chgrp␣ [OPTION]...␣GROUP␣FILE...
主要选项:

  • -v:详细说明文件所属的用户组的变化
  • -c:类似-v,仅所有权改变时显示
  • -r:改变本目录及其所有子目录中的文件所属的用户组

此外还有很多命令,这些命令其实不用死记硬背(也背不完啊那么多),而是像HTML标签和css属性一样,遇到需要的可以去搜索引擎直接查来用(当然那几个常用的你得会)。

推荐更多

B站教学视频:
【小白入门 通俗易懂】2021韩顺平 一周学会Linux
(该教程有很多分P选集,可自行点击跳转)

几个命令查找网站:
Linux命令大全(手册)
Linux命令大全
Linux命令手册