跳至主要內容

文件系统


文件系统

pwd

pwd命令显示列出当前所在的目录。

$ pwd

cd

cd命令用来改变用户所在的目录。

# 进入用户的主目录
$ cd

# 进入前一个工作目录
$ cd -

# 进入指定用户的主目录
$ cd ~user_name

ls

ls目录可以显示指定目录的内容。不加参数时,显示当前目录的内容。

$ ls

上面命令显示当前目录的内容。

ls命令也可以显示指定文件是否存在。

$ ls foo.txt
foo.txt

-l参数可以显示文件的详细信息。

$ ls -l foo.txt
-rw-rw-r-- 1 me   me   0 2016-03-06 14:52 foo.txt

上面命令输出结果的第一栏,是文件的类型和权限。

文件类型分为以下几种。

其他参数的用法。

# 显示多个目录的内容
$ ls ~ /usr

# -a --all 显示隐藏文件
$ ls -a

# -A 与-a类似,但是不显示当前目录和上一级目录两个点文件
$ ls -A

# -l 显示详细信息
$ ls -l

# -1 单列显示,每行只显示一个文件
$ ls -1

# -d 显示当前目录本身,而不是它的内容
# 通常与-l配合使用,列出一个目录本身的详细信息
$ ls -dl

# -F 目录名之后添加斜杠,可执行文件后面添加星号
$ ls -F

# -h 与-l配合使用,将文件大小显示为人类可读的格式

# -t 按文件修改时间排序,修改晚的排在前面
$ ls -t

# -s 按文件大小排序,

# --reverse 显示结果倒序排列
$ ls -lt --reverse

如果只显示一个目录里面的子目录,不显示文件,可以使用下面这些命令。

# 只显示常规目录
$ ls -d */
$ ls -F | grep /
$ ls -l | grep ^d
$ tree -dL 1

# 只显示隐藏目录
$ ls -d .*/

# 隐藏目录和非隐藏目录都显示
$ find -maxdepth 1 -type d

另一个简便方法是利用自动补全功能,先键入cd命令,然后连按两下tab键。

stat

stat命令是加强版的ls命令,可以显示一个文件的详细信息。

$ stat timestamp
File: 'timestamp'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 14265061 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me)
Access: 2008-10-08 15:15:39.000000000 -0400
Modify: 2008-10-08 15:15:39.000000000 -0400
Change: 2008-10-08 15:15:39.000000000 -0400

touch

touch用来设置或更新文件的访问,更改,和修改时间。然而,如果一个文件名参数是一个 不存在的文件,则会创建一个空文件。

$ touch timestamp

上面命令创建了一个名为timestamp空文件。如果该文件已经存在,就会把它的修改时间设置为当前时间。

$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}

上面的命令创建了一个包含一百个子目录,每个子目录中包含了26个空文件。

file

file命令显示指定文件的类型。

$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01

chmod

chmod命令用于更改文件的权限,是“change mode”的缩写。

$ chmod 600 foo.txt

上面命令将foo.txt的权限改成了600。

chmod还可以接受四个缩写,为不同的对象单独设置权限。

# 为所有者添加可执行权限
$ chmod u+x foo.txt

# 删除所有者的可执行权限
$ chmod u-x foo.txt

# 为所有人添加可执行权限,等价于 a+x
$ chmod +x foo.txt

# 删除其他人的读权限和写权限。
$ chmod o-rw foo.txt

# 设定用户组和其他人的权限是读权限和写权限
$ chmod go=rw foo.txt

# 为所有者添加执行权限,设定用户组和其他人为读权限和写权限,多种设定用逗号分隔
$ chmod u+x,go=rw foo.txt

添加权限。

删除权限只需将+更改为-,就可以删除任何已设置的指定权限。可以使用-R(或--recursive)选项来递归地操作目录和文件。

设置精确权限,可以使用=代替+-来实现此操作。如果想为用户、组或其他用户设置不同的权限,可以使用逗号将不同表达式分开(例如ug=rwx,o=rx)。

由于一共有3种可能的权限。也可以使用八进制数代替符号来设置权限。通过这种方式设置的权限最多使用3个八进制数。第1个数定义用户权限,第2个数定义组权限,第3个数定义其他权限。这3个数中的每一个都通过添加想要的权限设置来构造:读 (4)、写 (2) 和执行 (1)。

umask

umask用来查看和设置权限掩码。

$ umask
0022

上面命令显示当前系统之中,默认的文件掩码是0022,转为二进制就是000 000 010 010

可以看到,这个掩码是一个12位的二进制数,后面的9位分别代表文件三种使用对象的三类权限。只要对应位置上是1,就表示关闭该项权限,所以010就表示关闭读权限。

新建文件时,通常不会带有执行权限,也就是说,新建文件的默认权限是rw-rw-rw-。如果文件掩码是0022,那么用户组和其他人的写权限也会被拿掉。

$ touch new.txt
$ ls -l new.txt
-rw-r--r-- 1 me   me   0 2016-03-06 14:52 new.txt

上面代码中,new.txt的用户组和其他人的写权限就没了。

umask后面跟着参数,就表示设置权限掩码。

$ umask 0000

上面命令将权限掩码设为0000,实际上就是关闭了权限掩码。

umask命令设置的掩码值只能在当前Shell会话中生效,若当前Shell会话结束后,则必须重新设置。

du

du命令用于查看指定目录的大小。

$ du -hs /path/to/directory

显示第一层子目录的大小。

$ du -h --max-depth=1 /path/to/folder

参数的含义。

tree命令也可以显示子目录大小。

$ tree --du -h /path/to/directory

md5sum

md5sum命令用来显示一个文件的md5校验码。

$ md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece    image.iso

locate

locate程序快速搜索本机的路径名数据库,并且输出每个与给定字符串相匹配的文件名。

$ locate bin/zip
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit

locate数据库由另一个叫做updatedb的程序创建。大多数装有 locate 的系统会每隔一天运行一回 updatedb 程序。因为数据库不能被持续地更新,所以当使用 locate 时,你会发现 目前最新的文件不会出现。为了克服这个问题,可以手动运行 updatedb 程序, 更改为超级用户身份,在提示符下运行 updatedb 命令。

locate支持正则查找。--regexp参数支持基本的正则表达式,--regex参数支持扩展的正则表达式。

$ locate --regex 'bin/(bz|gz|zip)'

find

locate程序只能依据文件名来查找文件,而find程序能基于各种各样的属性,搜索一个给定目录(以及它的子目录),来查找文件。

# 输出当前目录的所有子目录和文件(含子目录)
$ find
$ find .

# 显示当前目录的文件总数
$ find . | wc -l

# 当前目录的子目录总数
$ find . -type d | wc -l

# 当前目录的文件总数(不含子目录)
$ find . -type f | wc -l

# 当前目录的文件名匹配“*.JPG”且大于1M的文件总数
$ find . -type f -name "\*.JPG" -size +1M | wc -l

-type参数支持的文件类型。

-size参数支持的文件大小类型。

find程序支持的查询参数。

# 找出包括空格或其它不规范字符的文件名或路径名
$ find . -regex '.*[^-\_./0-9a-zA-Z].*'

find程序还支持逻辑操作符。

# 或关系
( expression 1 ) -or ( expression 2 )

# 找出不是600权限的文件,或者不是700权限的目录
$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

find程序的逻辑表达式,具有“短路运算”的特点,即对于expr1 -operator expr2这个表达式,expr2不一定执行。这是为了提高运行速度。

为了方便执行一些常见操作,find程序定义了一些预定义操作。

# 找到匹配的文件,并显示在标准输出
# -print 是默认操作,可以省略
$ find . -print

# 删除后缀名为BAK的文件
# 执行 delete 操作前,最好先执行 print 操作,确认要删除哪些文件
$ find . -type f -name '*.BAK' -delete

预定义操作可以与逻辑表达式,结合使用。

$ find ~ -type f -and -name '*.BAK' -and -print

除了预定义操作以外,用户还可以使用-exec参数自定义操作。

-exec command {} ;

上面的命令中,command是一个命令行命令,{}用来指代当前路径,分号表示命令结束。

# 预定义的 -delete 操作,等同于下面的操作
-exec rm '{}' ';'

-exec使用时,每次找到一个匹配的文件,会启动一个新的指定命令的实例。

$ find ~ -type f -name 'foo*' -exec ls -l '{}' ';'

执行上面的命令,ls程序可能会被调用多次。

$ ls -l file1
$ ls -l file2

如果想改成ls程序只调用一次,要把find命令里面的分号,改成加号。

$ ls -l file1 file2
# 相当于
$ find ~ -type f -name 'foo*' -exec ls -l '{}' +

xargs

xargs命令从标准输入接受输入,并把输入转换为一个特定命令的参数列表。

$ find ~ -type f -name 'foo\*' -print | xargs ls -l