命令行文件管理入门
为了避免在你的真实文件中造成混乱,我们会先创建一个安全的“沙盒”环境进行练习。
1. 准备一个安全的“沙盒”环境
我们将在系统的临时文件夹 /tmp
中创建一个名为 tutorial
的新目录。/tmp
目录下的文件通常在系统重启后会被清空,非常适合用来做临时实验。
# 创建一个新目录
mkdir /tmp/tutorial
# 进入这个新目录
cd /tmp/tutorial
知识点解析:
mkdir
(make directory) 用于创建新目录。cd
(change directory) 用于切换当前工作目录。/tmp/tutorial
是一个绝对路径。它以根目录/
开始,告诉系统从最顶层开始寻找路径。如果只写mkdir tmp/tutorial
(没有开头的/
),命令会试图在当前目录下寻找tmp
目录,如果找不到就会报错。- 你可以随时使用
pwd
(print working directory) 命令来确认自己当前所在的目录位置。
2. 创建与管理目录
现在我们已经进入了安全的沙盒环境,让我们来创建一些子目录。
创建多个目录
mkdir
命令非常灵活,你可以一次性给它传递多个参数 (arguments),它会为你一次性创建所有目录。
mkdir dir1 dir2 dir3
使用 ls
(list) 命令查看一下当前目录的内容:
ls
你会看到 dir1
、dir2
和 dir3
这三个目录并列存在。
创建嵌套目录
有时候,你需要创建像 a/b/c
这样的层级目录。如果直接使用 mkdir a/b/c
,在 a
目录不存在的情况下命令会失败。这时,我们可以使用一个非常有用的选项 (option) -p
。
选项通常以 -
或 --
开头,用来改变命令的默认行为。-p
选项告诉 mkdir
“请一并创建所有必要的父目录 (parent)”。
mkdir -p dir4/dir5/dir6
ls
这次 ls
只会显示新增了一个 dir4
目录。dir5
在 dir4
里面,dir6
在 dir5
里面。我们可以用 cd
和 ls
来验证一下:
cd dir4
ls # 你会看到 dir5
cd dir5
ls # 你会看到 dir6
# 使用 ".." 返回上一级目录,我们可以连用两次返回两级
cd ../..
pwd # 确认回到了 /tmp/tutorial
关于选项(Options)的多种形式
命令行工具的选项有很多种写法,这主要是历史原因造成的。你无需全部记住,但了解一下会很有帮助。以下命令效果完全相同:
# 以下命令仅为演示,无需输入 mkdir --parents --verbose dir4/dir5 # 长单词形式 mkdir -p --verbose dir4/dir5 # 长短形式混合 mkdir -p -v dir4/dir5 # 多个短形式 mkdir -pv dir4/dir5 # 合并短形式
处理带空格的名称
如果你想创建一个名字里带空格的目录,比如 "my photos",直接输入 mkdir my photos
会发生什么?
mkdir my photos
ls
你会发现,系统创建了两个目录:my
和 photos
。这是因为在命令行中,空格是用来分隔参数的。为了让系统把 "my photos" 当作一个整体,你需要进行转义 (escaping),有三种常见方法:
# 1. 使用双引号
mkdir "folder 1"
# 2. 使用单引号
mkdir 'folder 2'
# 3. 使用反斜杠 `\` 来转义紧跟其后的空格
mkdir folder\ 3
ls
专家建议:告别空格
尽管命令行可以处理带空格的名称,但这无疑增加了操作的复杂性。资深的命令行用户倾向于使用下划线
_
或连字符-
来代替空格,例如my_photos
或my-photos
。这会让你的生活轻松很多。
3. 创建与查看文件
目录已经够多了,现在来创建一些文件。
使用 echo
和 >
创建文件
echo
命令会把它接收到的参数直接打印在屏幕上。
echo "这是一行测试文本"
而 >
符号是一个强大的功能,叫做输出重定向 (output redirection)。它能将一个命令原本要输出到屏幕的内容,转而写入到一个文件中。
# 这条命令不会在屏幕上显示任何东西
echo "这是第一个测试文件" > test_1.txt
# 让我们再创建几个
echo "这是第二个测试文件" > test_2.txt
echo "这是第三个测试文件" > test_3.txt
ls
现在你的目录里多了三个 .txt
文件。如果 >
指向的文件已存在,它会覆盖掉文件原有的所有内容。请务必小心使用!
使用 cat
查看和合并文件
cat
命令(来自 "concatenate",意为“连接”)可以用来查看文件内容。
cat test_1.txt
它最强大的功能是连接多个文件的内容并一次性输出。
cat test_1.txt test_2.txt test_3.txt
使用 >>
追加内容
如果你不想覆盖文件,而是想在文件末尾追加内容,可以使用 >>
。
echo "这是追加的一行!" >> test_1.txt
cat test_1.txt
现在 test_1.txt
会包含两行内容。
4. 提高效率的技巧
当文件变多时,手动输入每个文件名会很麻烦。命令行提供了一些强大的工具来简化这个过程。
使用通配符 *
和 ?
通配符是特殊的字符,可以匹配文件名中的模式。
?
:匹配任意单个字符。*
:匹配任意数量(包括零个)的字符。
假设你想查看所有 test_
开头的 .txt
文件,以下命令是等效的:
# 手动输入所有文件名
cat test_1.txt test_2.txt test_3.txt
# 使用 ? 匹配单个数字
cat test_?.txt
# 使用 * 匹配数字及之后的所有字符
cat test_*.txt
现在,让我们用这个技巧把所有测试文件的内容合并到一个新文件中:
cat test_*.txt > combined.txt
cat combined.txt
使用 less
浏览长文件
当一个文件内容太多,一屏显示不完时,cat
会一次性把所有内容刷过去,你根本来不及看。这时,你需要一个分页器 (pager) 程序。
less
是一个现代且功能强大的分页器(它的名字是个玩笑,因为它比老旧的 more
命令功能“更多”)。
# 试着多追加几次内容,让 combined.txt 变长
cat test_*.txt >> combined.txt
cat test_*.txt >> combined.txt
# 使用 less 查看
less combined.txt
在 less
界面中,你可以:
- 使用 上/下箭头键 或 PageUp/PageDown 键来滚动。
- 使用 Home/End 键跳转到文件开头/结尾。
- 按 q 键退出并返回到命令行。
5. 重要规则与最佳实践
最后,记住几个能让你避免很多麻烦的规则。
大小写敏感
在 Linux 和 macOS 中,文件名是大小写敏感的。File.txt
、file.txt
和 FILE.TXT
是三个完全不同的文件。
echo "小写" > a.txt
echo "大写" > A.TXT
ls
然而,在 Windows 系统中,文件名是大小写不敏感的,这三者会被视为同一个文件,可能导致数据丢失。
为了避免混淆和跨平台问题,强烈建议始终使用小写字母。
文件命名好习惯
综合以上所有内容,一个好的文件命名习惯是:
- 全部小写:避免因大小写混淆而出错。
- 使用字母、数字、下划线和连字符:即
a-z
,0-9
,_
,-
。 - 用
_
或-
替代空格:让文件在命令行中更容易处理。 - 避免特殊字符:如
*
,?
,&
,$
等,它们在命令行中有特殊含义。 - 包含文件扩展名:如
.txt
,.md
,.jpg
,方便识别文件类型。
遵循这些简单的规则,将使你在命令行的旅程中更加顺畅。