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
链接
- mkdir,opengroup.org
- mkdir 手册页,man.cat-v.org
- 12.3 mkdir 在 GNU Coreutils 手册中,gnu.org
cd 更改当前目录 |
cd 更改 shell 的当前目录。此当前目录将被 shell 启动的其他程序使用。
由于 "cd" 更改了 shell 的状态,它是一个shell 内建命令。相反,大多数命令是 shell 启动的单独程序。
例子
更改到 'foobar' 目录
$ cd foobar
更改到您的主目录,不带选项的 cd 命令会将您带回您的主目录。
$ cd
~ (波浪号) 存储您主目录的路径,此命令与上一个命令具有相同的效果。
$ cd ~
在后面加上用户名,该命令会更改到该特定用户的家目录。
$ pwd / $ cd ~user $ pwd /home/user
更改到父目录
$ cd ..
更改到上一个目录
$ cd -
提示
"CDPATH" 可能只在某些 shell 中有效。例如,ksh 拥有它。 |
通过在您的 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
链接
rm
[edit | edit source]
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
链接
- rmdir, opengroup.org
- rmdir 手册页, freebsd.org
- 12.7 rmdir 在 GNU Coreutils 手册中,gnu.org
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
链接
- touch, opengroup.org
- touch 手册页, man.cat-v.org
- 13.4 touch 在 GNU Coreutils 手册中,gnu.org
df
[edit | edit source]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
链接
du
[edit | edit source]显示磁盘使用情况。
链接
ln
[edit | edit source]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
更改文件的组所有权。
链接
- chgrp 在 The Open Group Base Specifications Issue 7 中,pubs.opengroup.org
- 13.2 chgrp:更改组所有权 在 GNU Coreutils 中,gnu.org
- W:Chgrp
创建硬链接。另请参见 ln。
链接
删除文件。
链接