最常用的文件操作除了将文件列出来外,就应该是重命名,复制,删除了。正如将文件列出来一样,大多数现代操作系统为这些任务提供了用户图形界面,但是在许多场景中,用命令行还是会更方便。
使用mv
命令重命名一个文件,是'move'的简写:
$ echo "test text" > test
$ mv test test_file.txt
$ ls
test_file.txt
这样test
文件重新更名为test_file.txt
文件。该示例的最后一步用ls
来确认文件是否更名成功,但是特定系统文件并不重要,所以在输出中隐藏了。('move'一词来源于我们通常用mv
命令将一个文件移至不同的目录中[第四章],可能在移动的过程中对它重命名。当移动的目标目录就是当前目录时,这样的移动就简化为重命名。)
cp
用于复制一个文件,是'copy'的简写:
$ cp test_file.txt second_test.txt
$ ls
second_test.txt
test_file.txt
最后, 删除文件的命令是:rm
,'remove'的简写:
$ rm second_test.txt
remove second_test.txt? y
$ ls second_test.txt
ls: second_test.txt: No such file or directory
注意:在许多操作系统中,默认地,当删除文件时系统会出现一个确认提示选项。任何以字母'y'或'Y'开始的答案会导致文件被删除,其他任何答案都会阻止本次删除操作。
顺便说下,以上提到的对cp
和rm
调用时,我通常不会手动一个字母一个字母的输入 test_file.txt
和second_test.txt
,而是像这样输入test⇥
和sec⇥
(这里的⇥代表tab键Table 1),利用tab的补全功能(Box 8)
Box 8. Tab 补全
大多数现代命令行程序(终端)支持tab补全,如果系统中只有一个有效匹配,可以自动补全一个单词。例如,如果只有一个文件
test_file
的名字以字母'tes'开始,我们可以像下面这样创建命令移除它:
$ rm tes⇥
上面的⇥是tab键(Table 1)。终端接下来会自动补全文件名,像rm test_file
.特别对于很长的文件名(或目录),tab补全可以节省很多冗长输入。这降低了认知负荷,因为这意味着你不需要去记住文件的全名,只需要记得前几个字母就行了。
$ ls foo⇥
会被补全为:
$ ls fooba
如果我们再次敲击tab键,我们可以看到如下的匹配列表:
$ ls fooba⇥
foobarquux foobazquux
我们可以再多敲些字母来解决这种歧义场景,所以可以在fooba后面再输入一个r然后再按⇥能得到想要的结果。
$ ls foobar⇥
这就能补全foobarquux
。这个场景很平常,经验丰富的命令行使用者可能会经常像这样输入f⇥⇥
让终端获取所有的可能性:
$ ls f⇥⇥
figure_1.png foobarquux foobazquux
再多输入几个字母通常就能锁定唯一文件。
rm
在一个未确认的Unix系统上的默认行为通常是不需要再确认,直接就删除文件,但是(因为删除了就不能再恢复)许多系统为rm
命令设置了选项出现一个确认是否删除选项。(你可以通过运行man rm
来确认,该选项是-i
,所以事实上rm
是rm -i
).在许多场景中确认删除选项都很不方便,例如,当你想要删除一系列文件并且不想再确认任何一个文件是否该删除。这种情景对使用通配符*
(在2.2章节中提过)来说特别常见,又例如,移除所有以'.txt'结尾的文件后缀名使用一个命令而且不需要再确认任何一个文件是否需要删除,你可以这样输入:
$ rm -f *.txt
这里的-f
(‘force’简写)重写了隐式的-i
选项并且立即移除所有的文件。(请注意,现在你可以理解 图2中的命令了)
Unix 简写
你可能注意到在本章节和2.2章节中命令都是简写:我们用ls
,mv
,cp
和rm
代替list
,move
,copy
和remove
。因为以前的命令名更容易理解和记忆,但你可能想知道为什么实际命令不长(图16)
图16:*Unix命令的简写可以是一个混乱的根源*
答案要追溯到Unix从多数计算机用户通过慢连接登录到集中服务器的时间起,用户按下键的时间和在终端出现的时间可能会有明显的延迟。对于常用命令如列出文件(listing file),list
与ls
和remove
与rm
之间但差异就很重要了。所以最后,最常用的Unix命令趋于只有两三个字母长。因为这样会更难记忆,这在学习它们的时候可能有些不方便,但对于命令行使用的一生来说,使用mv
这样的简写节省了很多时间。
练习
1.使用echo
命令和重定向操作>
创建一个名叫foo.txt
的文件,内容包含文本'hello,world'。然后使用cp
命令,复制foo.txt
到文件bar.tx
。使用diff
命令,确认两个文件的内容都相同。
2.组合使用cat
命令和重定向操作符>
,不使用cp
命令创建一个foo.txt
的副本,命名为baz.txt
。
3.创建一个叫做quux.txt
的文件,包含foo.txt
和bar.txt
的内容,bar.txt
的内容在后面。注意:正如2.1.1章节中备注的那样,cat
可以有多个参数。
4.对一个不存在的文件,使用rm nonexistent
和rm -f nonexistent
的区别.(nonexistent:不存在的文件名)