本文主要介绍 Linux Shell 中的文件与目录操作命令,旨在帮助初学者克服对“黑屏终端”的陌生感,系统掌握文件与目录操作的核心命令,这通常是通向 Linux 世界的第一步。
[本文基于 CentOS Linux release 7 系统环境]
一、什么是 Shell
在开始具体命令前,我们需要理解 Shell 的本质——它是一个命令解释器,是用户与操作系统内核进行交互操作的桥梁(接口)。
Shell 不仅能解释命令,还提供编程能力,但这超出了今天的讨论范围。
我们把那个黑黑的窗口称为终端(Terminal),它是系统的图形用户界面(Graphical User Interface,简称 GUI,又称“图形用户接口”),用于人机交互。
当你打开终端时,系统会自动启动一个 Shell 进程。最常见的 Shell 是 Bash(Bourne Again Shell,由贝尔实验室开发),它是大多数 Linux 发行版的默认选择。
停留在终端一闪一闪的光标处就是用户输入 Shell 命令的地方。在闪烁的光标之前,通常有一串符号标识,这是操作系统在等待用户输入命令时显示的特定字符,称为“命令行提示标识”“命令列提示符号”“命令提示符”(Command Prompt Symbol),它本身不是命令,而是提示用户可以开始输入的标识。
一个典型的命令行提示标识格式为:[用户名@主机名 工作目录]$。其中:
- • 工作目录:显示你当前所在的文件夹路径,
~ 表示家目录。 - •
# 是超级用户(root)的提示符符号,表示拥有最高权限。
如果我们在命令提示符后随便输入一些乱七八糟的字符,那么我们通常会遇到“command not found”错误,这意味着我们尝试运行一个程序或命令,但是系统无法在其预设的路径中找到这个程序或命令。例如:
$ mengzuishiguang-bash: mengzuishiguang: command not found
接下来,我会介绍一些常用的文件与目录操作命令,以帮助大家更快地入门 Linux 世界。
二、文件系统导航
在操作文件前,你要先知道自己当前在哪,以及如何移动。这需要我们掌握以下命令。
pwd
- • 名称: pwd - print name of current/working directory
- • 描述:输出当前位置(当前工作目录的完整路径名,即绝对路径)。
【注】绝对路径与相对路径
- • 绝对路径:
/home/user/file.txt(从根目录开始) - • 相对路径:
../sibling/file.txt(从当前目录开始)
ls
- • 名称:ls - list directory contents
- • 语法:
ls [OPTION]... [FILE]... - • 常用选项:
| | |
|---|
-a | --all | |
-l | | 使用长列表格式,即详细列表(显示文件类型与权限、硬链接数、所有者、所有组、文件大小、最后修改日期和时间、文件或目录名称)。 |
-h | --human-readable | 使用 -l 选项,以人类可读的格式输出大小(例如,1K、3M、5G)。 |
-r | --reverse | |
-t | | |
- • 示例:
$ lsdocuments downloads music pictures$ ls /bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var# 按修改时间从早到晚排序,最旧的文件显示在列表顶部,最新的文件显示在底部。$ ls -lrth picturestotal 5.1M-rw-r--r--. 1 user group 224 May 26 2024 pic1-rw-r--r--. 1 user group 16K May 26 2024 pic2-rw-r--r--. 1 user group 637K May 26 2024 pic3drwxr-xr-x. 2 user group 4.4M May 26 2024 others
【注】文件权限基础
$ ls -ldrwxr-xr-x 2 user group 4096 Jan 1 12:00 directory-rw-r--r-- 1 user group 1024 Jan 1 12:00 file.txt
- • 首字符标识类型:
d(目录)、-(普通文件)、l(链接文件)。 - • 后续 9 字符分三组
rwx(读、写、执行)权限,分别对应所有者、所属组、其他用户。其中,r 表示可读权限,w 表示可写权限,x 表示可执行权限,- 表示无权限。
cd
- • 名称:cd - change the current directory to dir
- • 语法:
cd [OPTION]... [dir] - • 示例:
$ cd /home/username/documents$ cd .. # 返回上一级目录$ cd ~ # 返回家目录$ cd - # 返回上一个工作目录
三、文件操作:创建、查看与管理
touch
- • 名称:touch - change file timestamps
- • 语法:
touch [OPTION]... FILE...
cat
- • 名称:cat - concatenate files and print on the standard output
- • 语法:
cat [OPTION]... [FILE]... - • 示例:
$ cat filename.txt$ cat -n filename.txt # 查看文件并显示行号
more
- • 名称:more - file perusal filter for crt viewing
- • 语法:
more [options] file [...] - • 示例:
# 按空格键翻页,q 键退出$ more longfile.txt$ more -10 filename.txt # 分页显示文件,每页 10 行$ more +20 filename.txt # 从第 20 行开始显示文件
less
- • 名称:less - opposite of more
- • 语法:
less [options] file [...] - • 描述:分页查看文件(支持上下翻页、搜索、跳转)。
- • 示例:
# 按空格键翻页,q 键退出$ less longfile.txt$ less -N filename.txt # 分页显示文件并显示行号$ less +20 filename.txt # 从第 20 行开始显示文件
如果你要问:“为什么 less 命令比 more 命令功能更多?”这是因为“Less is more!”
head
- • 名称:head - output the first part of files
- • 语法:
head [OPTION]... [FILE]... - • 示例:
$ head -n 20 filename.txt # 查看前 20 行
tail
- • 名称:tail - output the last part of files
- • 语法:
tail [OPTION]... [FILE]... - • 示例:
$ tail -n 20 filename.txt # 查看后 20 行$ tail -f logfile.log # 实时查看日志
cp
- • 名称:cp - copy files and directories
- • 语法:
cp [OPTION]... SOURCE... DIRECTORY - • 示例:
$ cp source.txt destination.txt$ cp -r sourcedir/ destdir/ # 递归复制目录
mv
- • 名称:mv - move (rename) files
- • 语法:
mv [OPTION]... SOURCE... DIRECTORY - • 示例:
$ mv oldname.txt newname.txt$ mv file.txt destdir/$ mv sourcedir/ /target/directory/
rm
- • 名称:rm - remove files or directories
- • 语法:
rm [OPTION]... FILE... - • 示例:
$ rm unwantedfile.txt$ rm -r directory/ # 递归删除目录
※注意: rm -rf / 这样的命令是极其危险的,会强制删除根目录下所有文件!执行删除操作前请务必仔细确认路径。
四、目录管理
mkdir
- • 名称:mkdir - make directories
- • 语法:
mkdir [OPTION]... DIRECTORY... - • 示例:
$ mkdir newfolder$ mkdir -p parent/child/grandchild # 创建多级目录
rmdir
- • 名称:rmdir - remove empty directories
- • 语法:
rmdir [OPTION]... DIRECTORY...
tree
- • 名称:tree - list contents of directories in a tree-like format
- • 语法:
tree [OPTION]... [Directory ...] - • 示例:
$ tree.├── dir1│ ├── file1.txt│ └── file2.txt└── dir22 directories, 2 files
【注】如果遇到 -bash: tree: command not found 错误提示,你可以尝试通过运行以下命令来安装 tree:
$ sudo yum install tree
五、文件查找与定位
find
- • 名称: find - search for files in a directory hierarchy
- • 语法:
find [OPTION]... [path...] [expression] - • 示例:
$ find /home -name "*.txt" # 查找所有后缀为“.txt”的文件$ find . -type f -size +1M # 查找大于 1MB 的文件$ find . -mtime -7 # 查找 7 天内修改的文件
【注】常用通配符
- •
*:匹配任意数量任意字符。例如,*.txt 匹配所有后缀为“.txt”的文件。 - •
?:匹配一个任意字符。例如,file?.log 可以匹配文件 file1.log、fileA.log,但不匹配 file10.log。 - •
[abc]:匹配方括号内的任意一个字符(例如,file[123].txt 可以匹配文件 file1.txt、file2.txt、file3.txt。)
locate
- • 名称:locate - find files by name
- • 语法:
locate [OPTION]... PATTERN... - • 示例:
$ locate filename.txt$ locate -c "*.log" # 显示系统中所有 .log 文件的总数$ locate -n 5 "httpd" # 只显示前 5 个包含 "httpd" 的文件路径
【注】如果遇到 -bash: locate: command not found 错误提示,你可以尝试通过运行以下命令来安装 locate:
$ sudo yum install mlocate$ sudo updatedb
which
- • 名称:which - shows the full path of (shell) commands
- • 语法:
which [options] [--] programname [...] - • 描述:查找命令位置(想要快速知道一个命令在哪儿并能直接执行)
- • 示例:
# which 只显示在 PATH 中找到的第一个 python 可执行文件$ which python/usr/bin/python
whereis
- • 名称:whereis - locate the binary, source, and manual page files for a command
- • 语法:
whereis [options] [-BMS directory... -f] name... - • 描述:查找命令位置(想要了解一个命令的二进制文件、帮助文档、源码都在哪儿)
- • 示例:
# whereis 显示所有 python 相关的二进制文件、手册页等$ whereis pythonpython: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /usr/include/python2.7 /usr/share/man/man1/python.1.gz
六、实用技巧
- 1. 使用 Tab 键自动补全命令:输入部分命令或文件名后按 Tab 键,Shell 会尝试补全命令。
- 2. 命令历史:按上下箭头(↑/↓)浏览历史命令,使用
history 命令可以查看完整历史。 - 3. 命令帮助:使用
man 命令可以查看一个命令的帮助文档,例如 man ls。
七、命令速查表
我将本文中的 Linux 命令整理如下,供大家查阅。
| | | |
|---|
| 目录操作 | pwd | pwd [OPTION]... | |
| ls | ls [OPTION]... [FILE]... | 常用选项:-a 显示所有文件(含隐藏)-l 长列表格式-h 人类可读大小 示例:$ ls -lh |
| cd | cd [dir] | |
| 文件操作 | touch | touch [OPTION]... FILE... | |
| cat | cat [OPTION]... [FILE]... | |
| more | more [options] file | |
| less | less [options] file | 比 more 功能更强。快捷键:/ 搜索,q 退出。 |
| head | head [OPTION]... [FILE]... | |
| tail | tail [OPTION]... [FILE]... | 示例:$ tail -f app.log (实时跟踪日志) |
| cp | cp [OPTION]... SOURCE... DIRECTORY | 示例:$ cp -r dir1/ dir2/ (递归复制目录) |
| mv | mv [OPTION]... SOURCE... DIRECTORY | |
| rm | rm [OPTION]... FILE... | 注意:-r 递归,-f 强制,切忌使用 rm -rf /。 |
| 目录管理 | mkdir | mkdir [OPTION]... DIRECTORY... | 示例:$ mkdir -p a/b/c (创建多级目录) |
| rmdir | rmdir [OPTION]... DIRECTORY... | |
| tree | tree [OPTION]... [Directory ...] | 非系统默认安装,需手动安装:sudo yum install tree |
| 文件查找 | find | find [path...] [expression] | 功能强大。示例:$ find . -name "*.log" |
| locate | locate [OPTION]... PATTERN... | 速度更快。非系统默认安装,需手动安装:sudo yum install mlocate初始使用 locate 命令时,需先执行 sudo updatedb 更新数据库。 |
| which | which [options] programname | |
| whereis | whereis [options] name | |
结语:从基础到精通
“一切皆文件”是 Linux 的基本哲学理念。目录是一种特殊的文件类型。今天介绍的命令只是 Linux 文件操作的入门基础,但足够应对一些日常任务。俗话说:“最好的学习方法是实践。”学习之初,建议经常打开终端,创建一些测试文件和目录,尝试各种命令组合,观察它们的行为,不要只停留在阅读上。
当使用这些命令变得像呼吸一样自然时,你已经为学习更高级的 Shell 技巧、脚本编程和系统管理打下了坚实基础。
此番炼器手札,炉火尚未全熄。若道友观之有趣,或可暂留此间,结一尘缘。待下回开炉铸器,新得感悟,必先与同道分享。