Linux 命令行与 shell 脚本编程大全 (3rd ed)(29):基本的 bash shell 命令 3.6.2

阅读数:11 2019 年 11 月 17 日 15:21

Linux命令行与shell脚本编程大全(3rd ed)(29):基本的bash shell命令 3.6.2

内容简介
这是一本关于 Linux 命令行与 shell 脚本编程的全方位教程,主要包括四大部分:Linux 命令行,shell 脚本编程基础,高级 shell 脚本编程,如何创建实用的 shell 脚本。本书针对 Linux 系统的新特性进行了全面更新,不仅涵盖了详尽的动手教程和现实世界中的实用信息,还提供了与所学内容相关的参考信息和背景资料。通过本书的学习,你将轻松写出自己的 shell 脚本。

(复制文件)

对系统管理员来说,在文件系统中将文件和目录从一个位置复制到另一个位置可谓家常便饭。cp命令可以完成这个任务。

在最基本的用法里,cp命令需要两个参数——源对象和目标对象:

复制代码
cp source destination

sourcedestination参数都是文件名时,cp命令将源文件复制成一个新文件,并且以destination命名。新文件就像全新的文件一样,有新的修改时间。

复制代码
$ cp test_one test_two
$ ls -l test_*
-rw-rw-r-- 1 christine christine 0 May 21 14:35 test_one
-rw-rw-r-- 1 christine christine 0 May 21 15:15 test_two
$

新文件test_two和文件test_one的修改时间并不一样。如果目标文件已经存在,cp命令可能并不会提醒这一点。最好是加上-i选项,强制 shell 询问是否需要覆盖已有文件。

复制代码
$ ls -l test_*
-rw-rw-r-- 1 christine christine 0 May 21 14:35 test_one
-rw-rw-r-- 1 christine christine 0 May 21 15:15 test_two
$
$ cp -i test_one test_two
cp: overwrite 'test_two'? n
$

如果不回答y,文件复制将不会继续。也可以将文件复制到现有目录中。

复制代码
$ cp -i test_one /home/christine/Documents/
$
$ ls -l /home/christine/Documents
total 0
-rw-rw-r-- 1 christine christine 0 May 21 15:25 test_one
$

新文件现就在目录 Documents 中了,和源文件同名。

说明 之前的例子在目标目录名尾部加上了一个正斜线(/),这表明 Documents 是目录而非文件。这有助于明确目的,而且在复制单个文件时非常重要。如果没有使用正斜线,子目录 /home/christine/Documents 又不存在,就会有麻烦。在这种情况下,试图将一个文件复制到 Documents 子目录反而会创建一个名为 Documents 的文件,连错误消息都不会显示!

上一个例子采用了绝对路径,不过也可以使用相对路径。

复制代码
$ cp -i test_one Documents/
cp: overwrite 'Documents/test_one'? y
$
$ ls -l Documents
total 0
-rw-rw-r-- 1 christine christine 0 May 21 15:28 test_one
$

本章在前面介绍了特殊符号可以用在相对文件路径中。其中的单点符(.)就很适合用于cp命令。记住,单点符表示当前工作目录。如果需要将一个带有很长的源对象名的文件复制到当前工作目录中时,单点符能够简化该任务。

复制代码
$ cp -i /etc/NetworkManager/NetworkManager.conf .
$
$ ls -l NetworkManager.conf
-rw-r--r-- 1 christine christine 76 May 21 15:55 NetworkManager.conf
$

想找到那个单点符可真是不容易!仔细看的话,你会发现它在第一行命令的末尾。如果你的源对象名很长,使用单点符要比输入完整的目标对象名省事得多。

窍门 cp命令的参数要比这里叙述的多得多。别忘了用man cp,你可以看到cp命令所有的可用参数。

cp命令的-R参数威力强大。可以用它在一条命令中递归地复制整个目录的内容。

复制代码
$ ls -Fd *Scripts
Scripts/
$ ls -l Scripts/
total 25
-rwxrw-r-- 1 christine christine 929 Apr 2 08:23 file_mod.sh
-rwxrw-r-- 1 christine christine 254 Jan 2 14:18 SGID_search.sh
-rwxrw-r-- 1 christine christine 243 Jan 2 13:42 SUID_search.sh
$
$ cp -R Scripts/ Mod_Scripts
$ ls -Fd *Scripts
Mod_Scripts/ Scripts/
$ ls -l Mod_Scripts
total 25
-rwxrw-r-- 1 christine christine 929 May 21 16:16 file_mod.sh
-rwxrw-r-- 1 christine christine 254 May 21 16:16 SGID_search.sh
-rwxrw-r-- 1 christine christine 243 May 21 16:16 SUID_search.sh
$

在执行cp -R命令之前,目录 Mod_Scripts 并不存在。它是随着cp -R命令被创建的,整个 Scripts 目录中的内容都被复制到其中。注意,在新的 Mod_Scripts 目录中,所有的文件都有对应的新日期。Mod_Scripts 目录现在已经成为了 Scripts 目录的完整副本。

说明 在上面的例子中,ls命令加入了-Fd选项。之前你已经见过-F选项了,不过-d选项可能还是第一次碰到。后者只列出目录本身的信息,不列出其中的内容。

也可以在cp命令中使用通配符。

复制代码
$ cp *script Mod_Scripts/
$ ls -l Mod_Scripts
total 26
-rwxrw-r-- 1 christine christine 929 May 21 16:16 file_mod.sh
-rwxrw-r-- 1 christine christine 54 May 21 16:27 my_script
-rwxrw-r-- 1 christine christine 254 May 21 16:16 SGID_search.sh
-rwxrw-r-- 1 christine christine 243 May 21 16:16 SUID_search.sh
$

该命令将所有以 script 结尾的文件复制到 Mod_Scripts 目录中。在这里,只需要复制一个文件:my_script。

在复制文件的时候,除了单点符和通配符之外,另一个 shell 特性也能派上用场。那就是制表键自动补全。

评论

发布