本篇文章中使用的目录结构:
/home/tom
├── bin
├── gamelist.txt
└── homework
├── chinese
├── math
│ └── ca.txt
└── science
路径名、文件名、工作目录
一个路径名(路径),从/
字符开始,该字符表示根目录;然后是到达该文件途径的所有的目录名,目录名之间使用/
分隔,例如:
/home/tom/homework/math/ca.txt
路径名描述了从根目录到某文件所经过的目录树的路径,其中ca.txt
叫做文件名。
目前所在的目录称为工作目录(当前目录)。
每当使用工作目录中的目录或者文件时,不需要指定整个路径,只需要键入文件名即可:
假设您目前处于/home/tom
目录中,也就是说您的工作目录是/home/tom
,目录下有一个文本文件/home/tom/gamelist.txt
,和一个目录/home/tom/homework
,那么下面的两条路径是等效的:
/home/tom/gamelist.txt
gamelist.txt
下面两条路径也是等效的:
/home/tom/homework
homework
对于路径,当使用/
开头的名称时,Linux假定这个名称是一个完整的路径名,从根目录开始;当只是用文件名时,Linux假定使用工作目录中的文件。
绝对路径、相对路径、四个路径缩写
如果目录序列从根目录开始,则称之为绝对路径名(absolute pathname)。
如果目录序列从工作目录开始,则称之为相对路径名(relative pathname)。
假设您目前在/home/tom
中,那么下面两条命令是等效的:
/home/tom/gamelist.txt # 绝对路径名
gamelist.txt # 相对路径名
Linux中有四个路径缩写:..
、.
、~
、-
。
-
..
:父目录。 -
.
:当前目录。 -
~
:家目录。 -
-
:上一个工作目录。
假设您在系统中用tom
用户名登录,并且家目录是/home/tom
,您当前的工作目录是/home/tom/homework
(其中cd
是切换工作目录到指定目录的命令):
$ cd . # 仍然在当前目录 /home/tom/homework
$ cd .. # 到父目录中,即 /home/tom
$ cd ../.. # 到父目录的父目录中,即 /
$ cd ~ # 到家目录中,即 /home/tom
$ cd - # 到上一个工作目录,即 /
..
和.
都是缩写,当路径使用..
或者.
开头时,实际上指的是一个完整的路径名。
..
和.
是实际的目录,由文件系统提供;~
是shell提供的便利写法;-
是命令cd
提供的便利写法。
Linux认为根目录的父目录就是根目录本身。
目录中移动 cd pwd、移动目录 mv、重命名目录 mv
显示工作目录的名称,可以使用pwd
命令:
$ pwd
切换工作目录,使用cd
命令。
只需要在cd
命令后面输入指定的目录名即可。
$ cd /home/tom # 切换工作目录到家目录
$ cd ~ # 切换工作目录到家目录
$ cd .. # 切换工作目录到父目录
$ cd tom # 切换到当前工作目录下的tom目录
$ cd ../tom # 切换到父目录下的tom目录
cd
是bash的内建命令,使用$ help cd
查看该命令的更多内容。
如果想要对目录进行移动,比如要将/home/homework/math
目录移动到家目录下,即移动之前:
/home/tom
├── bin
├── gamelist.txt
└── homework
├── chinese
├── math # 将要移动的目录
│ └── ca.txt
└── science
移动之后:
/home/tom
├── bin
├── gamelist.txt
├── homework
│ ├── chinese
│ └── science
└── math # 移动之后的目录
└── ca.txt
那么使用下面这条命令:
$ mv /home/tom/homework/math/ /home/tom
mv
的语法为:
mv SOURCE DEST
SOURCE
是希望移动或重命名的目录,DEST
是目标或者新名称。
如果您目前的工作目录是/home/wm
,那么完全可以使用相对路径:
$ pwd
/home/tom
$ mv homework/math/ ./
mv
命令不仅可以用来目录,还可以对目录进行重命名。
如果要将工作目录中的homework
重命名为hw
,可以使用下面的命令:
$ mv homework hw
创建目录 mkdir、删除目录 rmdir rm
使用mkdir [OPTION]... DIRECTORY...
创建目录,常用的命令选项有-p
。
$ mkdir extra # 创建extra目录
$ mkdir history literature # 创建history、literature两个目录
$ mkdir ~/bin # 在家目录下创建bin目录
使用mkdir
有两点需要注意:
- 在一个目录中,不能有两个相同名字的子目录。
- 默认情况下,如果父目录不存在,则不能创建子目录。
可以使用-p
选项忽略第二条限制:
$ mkdir abc/def
mkdir: cannot create directory ‘abc/def’: No such file or directory
$ mkdir -p abc/def
一些特殊字符不能出现在目录名中,比如/
,大多数时候,目录名使用小写字母。
删除目录使用rmdir
命令,常用的命令选项是-p
。
rmdir
命令有几点需要注意:
- 不能删除非空的目录。这是一项安全检查,防止失误删除文件。
- 默认只会删除目录序列中的最末的目录。可以使用
-p
来删除一串空目录。 - 不能删除工作目录和根目录之间的任何目录。
$ rmdir foo # 删除foo目录
$ rmdir -p foo/bar # 删除foo和foo下的bar目录
# bar必须是空目录
# foo下必须只用bar一个文件(目录也是文件)
rm
命令可以用来删除目录,对目录是否为空没有限制,使用-r
选项删除目录,-i
选项对用户进行提示。
rm -r foo/bar # 删除foo下的bar目录,而不检查是否为空
ls 基本操作
ls
用来显示目录内容。
将目录名作为参数,可以打印出目录中的内容。
$ ls homework/
chinese math science
homework
目录中有三个文件(目录),分别是chinese
、math
和science
。
也可以同时显示多个目录的内容,比如下面的例子显示了homework
和bin
目录下的内容,其中bin
目录下没有文件,homework
中有三个文件:
$ ls bin homework/
bin:
homework/:
chinese math science
使用-R
参数可以显示目录的全部“子孙”:
$ ls -R homework/
homework/:
chinese math science
homework/chinese:
homework/math:
ca.txt
homework/science:
-F
选项可以查看目录中文件的类型:
$ ls -F ./
bin/ gamelist.txt homework/
当前目录下有三个文件,其中bin
和homework
是目录,gamelist.txt
是普通文件。下表显示了ls -F
命令显示的标志:
标志 | 含义 | |
---|---|---|
空 | 普通文件:非可执行文件 | |
* |
普通文件:可执行文件 | |
/ |
目录 | |
@ |
符号链接 | |
` | ` | 命名管道/FIFO |
默认情况下,ls
命令不会显示以.
开头的文件,这类文件称为隐藏文件。为了显示隐藏文件,可以使用-a
选项显示出所有文件:
$ ls -a
. .bash_history .bashrc .cache .hello .lesshst
.. .bash_logout bin gamelist.txt homework .profile
-l
选项可以显示目录中文件的更多信息,-h
选项使用“人性化”的单位显示文件大小。
$ ls -l
total 8
drwxrwxr-x 2 tom tom 4096 May 29 2017 bin
-rw-rw-r-- 1 tom tom 0 May 6 20:23 gamelist.txt
drwxrwxr-x 5 tom tom 4096 May 29 2017 homework
第一行total 8
表示此目录一共占用8字节空间。
之后的三行为目录中的文件,每个文件一行,以其中一行为例,说明每列的意义:
drwxrwxr-x 2 tom tom 4096 May 29 2017 bin
其中(从左至右):
-
d
:指示符,表示这是一个目录。其余的指示符有:-
普通文件、l
符号连接、b
特殊文件(块设备)、c
特殊文件(字符设备)、p
命名管道/FIFO。 -
rwxrwxr-x
:一共三组,表示所有者、组用户和其他用户的权限。r
代表可读、w
代表可写、x
代表可执行。 -
2
:如果是目录,则表示目录中第一级子目录的个数;如果是普通文件,则表示其连接数。 -
tom
:所有者。 -
tom
:所属组。 -
4096
:占用空间,以字节为单位。 -
May 29 2017
:最后修改时间。 -
bin
:文件名。
使用-h
选项可以用适当的单位显示文件的大小:
$ ls -lh
total 8.0K
drwxrwxr-x 2 tom tom 4.0K May 29 2017 bin
-rw-rw-r-- 1 tom tom 0 May 6 20:23 gamelist.txt
drwxrwxr-x 5 tom tom 4.0K May 29 2017 homework
如果想列出某个目录自身(而不是其包含的文件)的信息,需使用-d
选项:
$ ls -dl homework/
drwxrwxr-x 5 tom tom 4096 May 29 2017 homework/
查看文件大小 du
du
(disk usage)可以用来显示文件的大小。
下面主要展示它的四个命令选项:
-
-a
:显示全部文件。 -
-c
:在最后一行显示左右指定文件总大小。 -
-h
:使用合适的单位显示文件大小。 -
-s
:只显示指定文件总大小。
使用du
可以方便的查看文件的大小:
$ du
4 ./homework/math
4 ./homework/science
4 ./homework/chinese
16 ./homework
4 ./.cache
4 ./bin
48 .
du
默认使用KB为单位,上面的例子中,第一列是文件大小,第二列是文件名。
使用-a
选项可以查看全部文件:
$ du -a
0 ./gamelist.txt
0 ./homework/math/ca.txt
4 ./homework/math
4 ./homework/science
4 ./homework/chinese
16 ./homework
4 ./.lesshst
0 ./.cache/motd.legal-displayed
4 ./.cache
0 ./.hello
4 ./.bashrc
4 ./.bash_history
4 ./.profile
4 ./bin
4 ./.bash_logout
48 .
也可以指定一个或者多个文件作为命令参数:
$ du -h homework/ bin/
4.0K homework/math
4.0K homework/science
4.0K homework/chinese
16K homework/
4.0K bin/
例子中使用-h
选项让du
以合适的单位显示文件大小。
使用-s
显示指定文件的总大小:
$ du -sh homework/ bin/
16K homework/
4.0K bin/
使用-c
选项显示所有文件的总大小:
$ du -csh homework/ bin/
16K homework/
4.0K bin/
20K total
通配符
通配符是表示特殊意义的字符。
常用的通配符如下:
符号 | 含义` |
---|---|
* |
匹配任何0个或多个字符 |
? |
匹配任何单个字符 |
[list] |
匹配list 中的任何字符 |
[^list] |
匹配不在list 中的任何字符 |
{string1,string2...} |
依次匹配其中指定的字符串 |
下面是几个例子:
$ ls /bin/b*
/bin/bash /bin/bzcat /bin/bzegrep /bin/bzgrep /bin/bzless
/bin/bunzip2 /bin/bzcmp /bin/bzexe /bin/bzip2 /bin/bzmore
/bin/busybox /bin/bzdiff /bin/bzfgrep /bin/bzip2recover
上面的命令显示出了/bin
目录下所有以b
开头的文件,其中*
匹配了任意0个或多个字符。
$ ls /bin/bz*grep
/bin/bzegrep /bin/bzfgrep /bin/bzgrep
这个例子匹配到了以bz
开头,以grep
结尾的所有文件。
$ ls /bin/bz?grep
/bin/bzegrep /bin/bzfgrep
这个例子匹配到了两个文件,其中?
代表着单个字符。
$ ls /bin/bz[fgh]grep
/bin/bzfgrep
[fgh]
代表着匹配f、g、h中的任意字符。
{string1,string2……}
表示依次匹配其中的字符串。
$ ls /bin/bz{grep,fgrep,ggrep}
ls: cannot access '/bin/bzggrep': No such file or directory
/bin/bzfgrep /bin/bzgrep