跳转到内容

Unix/命令/文件系统实用程序指南

来自维基教科书,开放世界中的开放书籍
ls
列出目录的内容

ls 是一个用于列出目录中的文件的实用程序。

最常用的选项是

-a
所有文件(包括以 . 开头的文件)
-l
长详细信息(提供文件统计信息)
-t
按创建时间排序
-u
按访问时间排序(或与 -l 一起显示上次访问时间)
-S
按大小排序
-r
反转顺序
-F
用 / 标记目录,用 * 标记可执行文件,用 @ 标记符号链接,用 = 标记本地套接字,用 | 标记命名管道 (FIFO)


其他选项包括

-Fx --color
彩色编码列表
-s
显示文件大小
-Z
显示文件/目录及其 SELinux 上下文(仅在 SELinux 启用树上)
-h
"人类可读";以 KB 和 MB 为单位显示文件大小(-h 可以与 -l 或 -s 一起使用)
ls *st* : list files that contain st in name
ls > list : output list to file named "list"
ls | more : fit listing to screen

例子

$ ls
fish  hello.txt
$ ls -l
-rw-r--r--    1 username    groupname        0 Apr 11 00:09 fish
-rw-r--r--    1 username    groupname       11 Apr 11 00:10 hello.txt

几个系统都有一个别名 ll,它与 ls -l 相同

$ ll
-rw-r--r--    1 username    groupname        0 Apr 11 00:09 fish
-rw-r--r--    1 username    groupname       11 Apr 11 00:10 hello.txt

小心使用 -F 选项。这里有一个例子

$ ls -F /usr/X11R6/bin/X*
/usr/X11R6/bin/X@          /usr/X11R6/bin/Xnest*      /usr/X11R6/bin/Xprt*
/usr/X11R6/bin/Xmark*      /usr/X11R6/bin/Xorg*       /usr/X11R6/bin/Xvfb*

我们还不知道是否存在一个名为 "X" 的符号链接和一个名为 "Xmark" 的可执行文件,或者 "X@" 和 "Xmark*" 仅仅是普通文件的名字。(尽管 "@" 和 "*" 在文件名中并不常见,但它们是可能的。)因此,我们通过删除 -F 来检查

$ ls /usr/X11R6/bin/X*
/usr/X11R6/bin/X           /usr/X11R6/bin/Xnest       /usr/X11R6/bin/Xprt
/usr/X11R6/bin/Xmark       /usr/X11R6/bin/Xorg        /usr/X11R6/bin/Xvfb

链接

  • ls,opengroup.org

mkdir 是一个用于创建目录的实用程序。

例子

$ mkdir newdirectoryname

-p 选项还会根据需要创建父目录。而不是

$ mkdir foo
$ cd foo
$ mkdir bar

你只需执行

$ mkdir -p foo/bar

链接

cd
更改当前目录

cd 更改 shell 的当前目录。此当前目录将被 shell 启动的其他程序使用。

由于 "cd" 更改了 shell 的状态,它是一个shell 内建命令。相反,大多数命令是 shell 启动的单独程序。

例子

更改到 'foobar' 目录

$ cd foobar

更改到您的主目录,不带选项的 cd 命令会将您带回您的主目录。

$ cd

~ (波浪号) 存储您主目录的路径,此命令与上一个命令具有相同的效果。

$ cd ~

在后面加上用户名,该命令会更改到该特定用户的家目录。

$ pwd
/
$ cd ~user
$ pwd
/home/user

更改到父目录

$ cd ..

更改到上一个目录

$ cd -

提示

通过在您的 shell 中设置 "CDPATH" 环境变量,您可以利用 shell 命令完成功能。

$ echo $CDPATH
.:/usr/local:/usr/share/doc

如果您设置了 $CDPATH,那么您按下 'TAB' 键并将获得可能的路径完成

$ cd bas [TAB]
base-config/  base-files/   base-passwd/  bash/         bastille/
pwd
打印工作目录

pwd(打印工作目录)显示您所在的当前目录。

虽然 "pwd" 通常作为外部程序提供(如/bin/pwd),但许多 shell 提供等效版本作为 shell 内建命令。与任何外部命令一样,"pwd" 会从启动它的 shell 或其他程序继承当前目录。

例子

$ pwd
/home/username

您可以更改目录,也可以

$ cd /usr
$ pwd
/usr

您也可以在脚本中使用 "pwd"。如果您对脚本有足够的经验,那么您就会知道下一行会抱怨当前目录是/home/username.

$ test "x$(pwd)" = x/home/username || echo wrong directory
chroot
更改根目录

chroot 更改根文件系统。 "chroot" 页面 在 Linux 问题维基中解释了您可能想要执行此操作的原因。

例子

要更改根文件系统,以便/mnt/usbdrive/成为/并且无法看到它之外的文件

# chroot /mnt/usbdrive/

您必须是 root 用户才能 "chroot"。其他用户将能够使用 "chroot" 获取 root(超级用户)权限,因此禁止他们使用 "chroot"。

$ chroot /mnt/usbdrive/
chroot: /mnt/usbdrive/: Operation not permitted

cp 复制文件

最常用的选项是

-r
复制目录(递归)
-p
保留权限、所有权和时间戳
-i
在覆盖之前提示
-v
详细,显示正在复制的文件名

例子

Makes a copy of file 'debian' and call it 'Debian' (assuming 'Debian' is not already a directory)
$ cp -i debian Debian
Makes a copy of file 'debian' and put it at /tmp/debian
$ cp -i debian /tmp/debian 
Same as the previous command (the filename defaults to be the same).
$ cp -i debian /tmp 
Makes a copy of directory 'mydir' (and all its contents) and put it at /tmp/mydir
$ cp -ir mydir/ /tmp 
Copy multiple files to directory /tmp
$ cp -i foo bar baz /tmp 

链接

mv 移动和/或重命名文件

例子

Rename file 'unix' to 'Unix' (assuming "Unix" is not a directory)
$ mv -i unix Unix
Move file Unix from your home directory to /tmp.
$ mv -i ~/Unix /tmp/Unix
Same as the previous command (the filename defaults to be the same).
$ mv -i ~/Unix /tmp
Move file Unix from your home directory to /tmp, and rename it to 'unix'.
$ mv -i ~/Unix /tmp/unix
Move multiple files to directory /tmp
$ mv -i foo bar baz /tmp

链接

  • mv, opengroup.org
  • mv 手册页, man.cat-v.org
  • mv 在 GNU Coreutils 手册中,gnu.org
rm
删除文件

rm 从文件系统中删除文件,类似于 DOS 中的“del”命令。

GNU 长选项(如--directory) 在 Linux 上可用,但在大多数其他系统上不可用。

一些有用的选项是

-d, --directory
删除 FILE,即使它是一个空目录(某些系统允许超级用户删除非空目录)
-f, --force
忽略不存在的文件,从不提示
-i, --interactive
在任何删除之前提示
-P
(*BSD 仅限) 在删除之前覆盖文件
-r, -R, --recursive
递归删除目录的内容(通常必须使用 force 选项才能成功运行 rm 递归)
-v, --verbose
(仅限 GNU) 解释正在执行的操作
--help
(仅限 GNU) 显示帮助并退出
--version
(仅限 GNU) 输出版本信息并退出

例子

“rm”的使用被认为比其他操作系统中的等效命令更危险,因为 shell 解析通配符和特殊目录名称的方式以及它的非详细操作。

这是一个经典的例子。与其删除以.o结尾的文件(“*.o”),它删除目录中的所有文件(“*”),还删除一个名为.o. 的文件。在星号和句号之间有一个不需要的空格。

$ rm * .o
rm: cannot remove `.o': No such file or directory

要删除一个名称以 `-` 开头的文件,例如 `-foo`,请使用以下命令之一

$ rm -- -foo
$ rm ./-foo

创建一个名为“remove”的别名可能很有用,它将文件移动到一个本地“trash”文件中,这样您就可以去那里恢复意外“remove”的文件。

安全删除文件

请注意,如果您使用 rm 删除文件,通常可以恢复该文件的内容,因为rm不会从硬盘中删除它。它只是删除文件系统到它的链接。

在 *BSD 系统上,-P 选项在删除文件之前用该文件覆盖数据。

$ rm -P secretfile

但是,正如 NetBSD 手册页 解释的那样

最近的研究表明,可能需要使用精心选择的数据模式进行 35 次覆盖才能真正防止从磁性磁盘中恢复数据。因此,-P 选项很可能既不满足其设计目的,对于默认操作来说成本又太高。

因此,虽然检查数据(使用 fsdb 或制作磁盘映像)不会显示秘密数据,但其他方法(例如实验室检查磁盘)会显示数据。简而言之,rm -P 不会安全地删除数据。试图安全删除数据的程序是 GNU shred,它在 Linux 上可用。但“shred”并不总是能够成功地安全删除数据;请阅读下面关于它的条目。

rmdir

[edit | edit source]

rmdir 是一个用于删除空目录的实用程序。

例子

$ rmdir directoryname

如果目录不为空,则以递归方式删除目录及其所有内容的正确方法是使用

$ rm -r directoryname

链接

shred

[edit | edit source]
shred
尝试安全删除文件

shred 用特殊数据模式多次覆盖文件,使文件中的旧内容无法从磁盘(尤其是硬盘)中恢复。此命令是 GNU coreutils 的一部分,因此它通常只在 Linux 系统上可用。

请注意,这实际上对大多数文件系统无效,因为它们可以保留数据的旧副本。大多数流行的 Linux 文件系统(包括 ext3)通过日志记录保留此类副本。但是,“shred”对于销毁整个分区或磁盘上的数据非常有用。

一些有用的选项是

-u, --remove
删除文件后将其取消链接
-NUMBER, -n NUMBER, --iterations=NUMBER
覆盖文件的迭代次数;默认值为 25 次迭代

示例: 删除并完全销毁secretfile来自一个就地覆盖数据且不使用日志记录的文件系统(例如,*BSD 的 UFS 文件系统)。在最后一步,在数据被销毁后,“-u”选项将文件从文件系统中取消链接。

$ shred -u secretfile

请注意,如果secretfile具有多个硬链接(例如使用 ln),它将继续使用这些其他名称存在,但只包含随机数据。

touch

[edit | edit source]

touch 允许您更改文件的日期。也可以用来创建一个空文件。

例子

这将把filename 的访问日期和时间更改为当前时间。如果filename 不存在,它将创建一个空文件。

$ touch filename

链接

df 报告每个分区上可用的可用磁盘空间量。

$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/md0               5763508    207380   5263352   4% /
/dev/md1              78819376  13722288  61093296  19% /home
/dev/md4              23070564   4309572  17589056  20% /usr
/dev/md2               5763508   1757404   3713328  33% /var
/dev/md3               2877756    334740   2396832  13% /tmp


以人类可读的格式报告磁盘使用情况,块大小为千字节、兆字节、千兆字节。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1             2.3G  2.1G  133M  95% /
tmpfs                  61M  8.0K   61M   1% /dev/shm
/dev/hda2             2.0G  1.8G  113M  94% /usr

链接

显示磁盘使用情况。

链接

ln 创建文件之间的链接。

符号链接是包含指向独立文件的绝对或相对路径的特殊文件。指向符号链接的引用将“转发”到它(符号链接)指向的文件。被转发引用的文件“不知道”链接;如果指向的文件被移动或删除,链接将只指向空值(不会发出警告,也不会尝试将链接“刷新”到文件的新位置)。

在 Unix 中,关于文件的所有信息 - 所有者、组、权限、大小、链接数量、磁盘上的位置 - 都存储在 inode 中(文件名 除外)。文件名存储在目录中,在那里 inode 编号(操作系统引用文件的方式)与文件名(文本字符串;用户引用文件的方式)配对。“链接数量”条目在 inode 中,跟踪 inode 编号在某个目录中与名称配对的次数。

使用ln,"源文件"仅用于确定 inode 号。然后,使用该 inode 号在某个目录中创建新的 inode 号到文件名的条目,并增加 "链接数"计数器。重要的是,这(与符号链接不同)是同一个文件,在各个方面都相同……只是该文件可以通过不同的名称和/或从不同的位置访问。移动或删除 "原始" 源文件不会影响其他链接。删除文件的某个链接只会从目录中删除其条目……只有当任何目录中的最后一个链接被删除时,文件才会真正从磁盘中删除。

硬链接不能(与符号链接不同)用于引用另一个文件系统上的文件,硬链接通常也不能用于链接到目录。

例子

要创建一个指向文件 "/home/alice/code/bin/world" 的软(符号)链接 "hello"

$ ln -s /home/alice/code/bin/world hello

要创建一个从文件 "foo" 到文件 "bar" 的(硬)链接

$ ls -l
total 1
-rw-r--r--  1  rtm  users  50  Aug 15   foo
$ ln foo bar
$ ls -l
total 2
-rw-r--r--  2  rtm  users  50  Aug 15   foo
-rw-r--r--  2  rtm  users  50  Aug 15   bar

第一个数字ls -l的列表显示了文件拥有的(硬)链接数,换句话说,就是文件在某个目录中被记录的次数。

链接

chown
更改文件的拥有者

chown 更改文件的所有者和组。通常,只有 root 用户可以执行此操作,但如果用户拥有某个文件,则该用户可以更改组,但只能更改包含该用户的组。在旧系统中,用户将文件赠送给其他用户的功能会导致滥用,因此大多数系统禁止非 root 用户更改文件的所有者。

一些有用的选项是

-R
递归地更改整个目录树的所有者/组
-h
不遵循符号链接,即更改链接的所有者,而不是目标文件
-f
如果更改失败,则指示没有错误

例子

Root 将 "/etc/passwd" 和 "/etc/shadow" 的所有权更改为用户 root,组 wheel

# chown root:wheel /etc/passwd /etc/shadow

相同,但只更改所有者

# chown root: /etc/{passwd,shadow}

相同,但只更改组

# chown :wheel /etc/{passwd,shadow}

Root 将 "/etc/ssh" 中的所有文件(包括子目录中的文件)赠送给用户 root,组 wheel

# chown -R root:wheel /etc/ssh

相同,但不包括目录中的文件(并且隐藏文件 "/etc/ssh/.*" 也会被遗漏)

# chown root:wheel /etc/ssh/*

用户 "tux" 将目录 "/usr/local/src/xc" 从组 "tux" 更改为组 "wheel"。Tux 是这两个组的成员。

$ ls -ld /usr/local/src/xc
drwxr-xr-x  11 tux  tux  512 Sep 30 16:19 /usr/local/src/xc
$ chown tux:wheel /usr/local/src/xc
$ ls -ld /usr/local/src/xc
drwxr-xr-x  11 tux  wheel  512 Sep 30 16:19 /usr/local/src/xc
chmod
更改文件模式

chmod 更改文件的权限。要理解此命令,必须熟悉 Unix 文件权限。有三种权限:读取 ("r")、写入 ("w") 和执行 ("x")。有三种权限集:针对文件的所有者 ("u")、针对文件的组 ("g") 和针对其他用户 ("o")。

对于文件,"执行" 意味着将它作为程序运行。对于目录,需要 "执行" 权限才能使用该目录树中的任何内容,因此对 "/usr/share/doc/README" 执行任何操作都需要对 "/", "/usr"、"/usr/share" 和 "/usr/share/doc" 具有执行权限。

如果您对更高级的主题(如 set-uid、set-gid、粘滞位和八进制数)感兴趣,请尝试阅读 FreeBSD 手册页,网址为 https://freebsd.ac.cn/cgi/man.cgi(在表单中输入 "chmod" 并提交)。

一个有用的选项是

-R
递归地更改或设置整个目录树的权限

例子

我们编写了一个名为 "configure" 的 shell 脚本。我们使它可执行 ("+x"),然后将其作为命令执行。通常,"+x" 等于 "u+x" 或 "ug+x",具体取决于文件模式创建掩码的状态。

$ chmod +x configure
$ ./configure

允许拥有者运行 "configure"

$ chmod u+x configure

禁止组和其他用户运行 "configure"

$ chmod go-x configure

对于所有用户(除了所有者 ("go")),禁用对 "~/mail" 和 "~/private" ("-rwx") 的所有访问权限。这样,内容就是私有的,只有其所有者(或 root)才能访问它们。

$ chmod go-rwx ~/mail ~/private

请注意,在前面的示例中,没有指定 "-R"。通过禁用执行位 ("-x"),~/{mail,private}中的所有文件都受保护,即使它们的组和其他读取位已启用。因此,只需将某个文件从~/{mail,private}内部移动到像/tmp这样的公共位置,就可以让其他用户再次访问这些文件。

"root" 用户想要设置/usr/local/src以便 "wsrc" 组中的所有用户(包括 "tux")都可以在其中创建文件。Root 将继续拥有该目录。这可以通过将/usr/local/src的组更改为 "wsrc",然后向组 ("g") 授予读取、写入和执行权限 ("+rwx") 来完成。

# chown :wsrc /usr/local/src
# chmod g+rwx /usr/local/src

所有类 Unix 系统都应允许所有用户在 "/tmp" 和 "/var/tmp" 中创建临时文件。因此,root 将所有权限 ("+rwx") 授予每个人 ("a",代表 "ugo")。

# chmod a+rwx /tmp /var/tmp

上述问题在于,由于所有用户对 /tmp 和 /var/tmp 都有写入权限,因此每个用户都可以删除和重命名文件,即使这些文件不是他们创建的。例如,"tux" 可以创建 "/tmp/socket.3908",而另一个用户可以删除它或将其重命名为 "/tmp/garbage",从而惹恼 Tux。为了保护临时文件,我们使用名为 "t" 的粘滞位。这将 /tmp 中文件的删除和重命名限制为 root、/tmp 的所有者(也是 root)和文件的拥有者("/tmp/socket.3908" 的拥有者是 Tux)。它对 /var/tmp 执行相同的操作。因此,我们应该做的是

# chmod a+rwxt /tmp /var/tmp

更改文件的组所有权。

链接

创建硬链接。另请参见 ln

链接

删除文件。

链接

华夏公益教科书