对话 UNIX,第 5 部分: 操纵数据与文件--笔记

来源:互联网 发布:怎么下皮皮跑胡子软件 编辑:程序博客网 时间:2024/06/07 08:58

1.tar 实用程序将一个或多个文件和目录打包为单个文件,并保持原始文件的大小、拥有者、权限、文件类型及其在文件系统层次结构中的位置。tar 实用程序将您的文件完整地记录到磁带中,tar 磁带存档程序 (tape archiver) 的首字母缩写。

要为这两个文件和一个目录创建存档,可以运行下面的 tar 命令:

$ tar --create --verbose --gzip --file archive.tgz *
css/
css/style.css
css/valid.css
demo.rb
tech.pdf

 

--create 选项告诉 tar 创建一个存档;--verbose 选项为 tar 所处理的文件生成一个列表;--gzip 选项启用 gzip 方式的压缩,这将缩小该存档的大小;而 --file archive.tgz 指定了存档的名称。

Shell 将星号 (*) 解释为任何文件,所以对其展开后为两个文件和一个目录。从上面的输出中您可以看出,tar css 目录进行了存档,同时递归地对该目录中的内容进行了存档。

在运行 tar 命令之后,当前目录中包含了一个新的文件 archive.tgz

$ ls -l archive.tgz 
-rw-r--r--  1 mstreicher mstreicher 105470 Oct 13 17:16 archive.tgz

 

现在,您可以将 archive.tgz 复制到另一台计算机,并在远程计算机上使用 tar 解压存档的内容。事实上,用来恢复文件的命令行与前面使用的命令行基本相同。要对这个存档进行解压,可以使用:

$ tar --extract --verbose --gunzip --preserve-permissions --file archive.tgz

 

这个 tar 命令将解压 archive.tgz 压缩文件中的内容。--extract 选项与 --create 选项正好相反;--gunzip --gzip 相反,而 --preserve-permissions 将重新创建原始文件的权限。

2.联合ssh使用 tar

您可以组合使用 Secure Shell (SSH) tar 命令,以将文件存档、复制和解压合并为一步操作。下面是完成这项工作的命令:

$ (cd ~/stuff; tar --create --gzip --file - *) | /
  ssh destination tar --extract --gunzip --file --verbose -C stuff

 

该命令进行了很多操作,所以让我们对其进行分解:

  1. 命令中带圆括号的部分称为subshellsubshell 中进行的更改,例如更改目录,不会影响到您的命令行,但是它将影响 subshell 的执行环境。因此,第一个短语 (cd ~/stuff; tar --create --gzip --file - *) 更改到目录 ~/stuff,然后运行 tar因为 subshell 后面跟着管道,所以 subshell 的所有输出都通过管道传输给了下一个命令。
  2. 与许多其他的 UNIX 实用程序一样,tar 可以分别向标准输出 (stdout) 写入、从标准输入 (stdin) 读取。stdout stdin 通常表示为连字符 (-)。所以,短语 --create --file - stdout 上创建存档。
  3. 管道 (|) subshell 的所有输出通过管道传输给 ssh。这样可以有效地将所有的输出从源计算机传输到目标计算机。
  4. 最后,目标计算机运行自己的 tar 实例对存档进行解压。然而,这里的 --extract --file - 标准输入 读取存档。-C 选项强迫接收方 tar 在开始进行任何处理之前,将目录更改到 stuff(在远程 home 目录中)。最后的结果是,将通过 ssh 传输的存档解压到 ~/stuff 中。

从远程计算机中获取创建的存档并解压到本地计算机。下面的命令可以实现这项任务,在本地计算机中运行:

$ ssh destination cat archive.tgz | /
  (cd ~/stuff; tar --extract --gunzip --file -)

 

在远程计算机上打开远程存档,将 cat 产生的字节流发送到 subshell,这个 subshell 首先更改目录,

3. 在两台计算机之间传输文件的另一种方法是使用 scp,即安全复制 (secure copy)。顾名思义,scp 的工作方式与普通的 cp 非常相似,它可以用来将文件从一个地方复制到另一个地方,可以在同一台计算机上或两台不同的计算机之间。

在这个示例中,cp -pr 递归地将所有的文件和目录复制到 /home/joe/stuff-r 表示递归;-p 表示保持该文件的时间戳。

您可以使用 scp 完成相同的工作(即在本地进行复制):

$ scp -pr * /home/joe/stuff

 

但如果您指定了远程系统,那么 scp 可以通过网络复制文件:

$ scp -pr * destination:/home/joe/stuff

 

$ scp -pr ~/doc destination:/path/to/doc
$ scp -pr ~/doc destination:/path/to/doc/

请注意,目标计算机上的目录没有尾部的斜杠 (/)scp 将这个路径解释为 ~/doc 目录中的内容复制到目标计算机的 /path/to/doc 目录。与 cp 一样,与本地文件和目录具有相同名称的远程文件和目录将被覆盖,而远程系统中所特有的文件将保持不变。

然而,如果您添加上尾部的斜杠

scp 将后面的这个路径解释为 ~/doc 目录复制到 /path/to/doc/ 目录。所以,将本地 doc 目录复制到远程目录中,而不是覆盖远程目录的内容。尾部的斜杠并不是一个错误。有时您可能希望使用它,而有时您可能不希望使用它,这取决于实际情况。

4Rsync:保持同步

其最大的优点在于,rsync 具有各种选项,要使得一个目录成为另一个目录真正的镜像,可以使用相应的选项删除原始目录中不存在的那些文件。让我们来看一些示例:

$ rsync -e ssh --times *.txt destination:

 

这个命令将当前工作目录中所有的文本文件复制到您在名为 destination 的计算机上的 home 目录中-times 选项保持每个文件的访问权限、创建和最后修改时间。

$ rsync -e ssh --times --perms --recursive --delete doc destination:

 

这个变化的 rsync 命令在目标计算机上您的 home 目录中创建本地 doc 目录的镜像。同时保持文件的时间和权限,并且删除外来的文件(即,在本地目录中不存在的远程目录中的文件)。

因为 rsync 可能执行一些重要的更改,所以您可能希望为该命令行添加 --dry-run 选项,以便预览 rsync 计划完成哪些操作。--dry-run 并不进行任何更改,它仅仅显示将要执行的操作,如下面的清单 3 所示。


清单 3. 预览 rsync 将要执行的操作

        
$ rsync -e ssh --dry-run --times --perms --recursive --delete bin destination:
building file list ... done
bin/
skipping non-regular file "bin/HTML.pl"
skipping non-regular file "bin/Quark.pl"
bin/Responses/
bin/Responses/DBI.pm
bin/Responses/Response.pm
skipping non-regular file "bin/XML.pl"
bin/backupdca.sh
bin/lib/
bin/report.pl
bin/report.txt
 
sent 724 bytes  received 108 bytes  554.67 bytes/sec
total size is 168879  speedup is 202.98

 

rsync 具有许多选项:

  • -a 是非常有用的选项,因为它是 --group --owner --perms --times --devices --links --recursive 的缩写。--devices 重新创建设备文件,而 --links 将符号链接复制为符号链接,而不是复制符号链接所指向的内容。
  • --update 可以防止 rsync 覆盖较新的文件。如果远程系统具有比本地系统较新的文件,那么将会保留远程系统中的这个文件。
  • 可以尝试使用 --verbose 选项,以便在 rsync 命令执行的过程中进行观察。

 

 

 

 

 

 
原创粉丝点击