# 使用命令行工具管理文件
## 目标
能够在各种目录中创建、复制、链接、移动和删除文件与子目录。
## 命令行文件管理
文件管理涉及创建、删除、复制和移动文件。此外,也可以创建、删除、复制和移动目录,以帮助有条理地整理文件。在命令行执行文件管理时,要求知道当前的工作目录,这样才能为直接任务选用绝对或相对路径语法以实现最该效率。
### 文件管理器命令
| 文件管理命令 | 单一来源 | 多来源 |
| --- | --- | --- |
| 复制文件 | cp file1 file2 | cp file1 file2 file3 dir④ |
| 移动文件 | mv file1 file2① | mv file1 file2 file3 dir④ |
| 删除文件 | rm file1 | rm -f file1 file2 file3⑤ |
| 创建目录 | mkdir dir | mkdir -p part1/part2/dir⑥ |
| 复制目录 | cp -r dir1 dir2② | cp -r dir1 dir2 dir3 dir4④ |
| 移动目录 | mv dir1 dir2③ | mv dir1 dir2 dir3 dir4④ |
| 删除目录 | rm -r dir1② | rm -rf dir1 dir2 dir3⑤ |
---
| 注: | ①结果为重命名。<br>②需要使用“递归”选项来处理来源目录。<br>③如果 dir2 存在,则结果为移动。如果 dir2 不存在,则结果为重命名。<br>④最后一个参数必须是目录。<br>⑤请谨慎使用“force”选项,系统将不会提示您确认操作。<br>⑥使用“创建父级”选项时应小心;无法捕获键入错误。 |
| --- | --- |
#### 创建目录
mkdir 命令创建一个或多个目录或子目录;如果文件名已存在,或者尝试在不存在的父目录中创建目录,将生成错误。-p 父级选项将为请求的目标位置创建缺失的父目录。使用 mkdir -p 时应小心,因为意外拼写错误将创建不需要的目录,而不会生成错误信息。
在以下示例中,用户尝试使用 mkdir 在现有的 Videos 目录中创建名为 Watched 的子目录,但是却写错目录名称。
~~~
[student@desktopX~]$ mkdir Video/Watched
mkdir: cannot create directory 'Video/Watched': No such file or directory
~~~
mkdir 运行失败,因为将 Videos 拼写错误,而且目录 Video 也不存在。假如用户是将 mkdir 与 -p 选项结合使用,则不会出现错误,而且用户会得到两个目录:Videos 和 Video,同时会在错误的位置中创建子目录 Watched。
~~~
[student@desktopX~]$ mkdir Videos/Watched
[student@desktopX~]$ cd Documents
[student@desktopX Documents]$ mkdir projectX ProjectY
[student@desktopX Documents]$ mkdir -p Thesis/Chapter1 Thesis/Chapter2 Thesis/Chapter3
[student@desktopX Documents]$ cd
[student@desktopX~]$ ls -R Videos Documents
Documents:
ProjectX ProjectY Thesis thesis_chapter1.odf thesis_chapter2.odf
Documents/ProjectX:
Documents/ProjectY:
Documents/Thesis:
Chapter1 Chapter2 Chapter3
Documents/Thesis/Chapter1:
Documents/Thesis/Chapter2:
Documents/Thesis/Chapter3:
Videos:
blockbusterl.ogg blockbuster2.ogg Watched
Videos/Watched:
[student@desktopX~]$
~~~
最后一个 mkdir 通过一个命令创建了三个 ChapterN 子目录。-p 父级消息创建缺少的父目录 Thesis。
#### 复制文件
cp 命令复制一个或多个文件,成为新的独立文件。其语法允许将一个现有文件复制为当前或另一目录中的一个新文件,或者将多个文件复制到另一目录中。在任何目标位置上,新文件名都必须唯一。如果新文件名不唯一,那么复制命令将覆盖现有文件。
~~~
[student@desktopX~]$ cd Videos
[student@desktopX Videos]$ cp blockbusterl.ogg blockbuster3.ogg
[student@desktopX Videos]$ ls -l
total 0
-rw-rw-r--. student student 0 Feb 8 16:23 blockbuster1.ogg
-rw-rw-r--. student student 0 Feb 8 16:24 blockbuster2.ogg
-rw-rw-r--. student student 0 Feb 8 19:02 blockbuster3.ogg
drwxrwxr-x. student student 4096 Feb 8 23:35 Watched
[student@desktopX Videos]$
~~~
在通过一个命令复制多个文件时,最后一个参数必须为目录。复制的文件在新的目录中保留其原有名称。目标位置上存在的冲突文件名可能会被覆盖。为防止用户意外覆盖带有内容的目录,多文件 cp 命令将忽略指定为来源的目录。复制带有内容的非空目录要求使用 -r 递归选项。
~~~
[student@desktopX Videos]$ cd ../Documents
[student@desktopX Documents]$ cp thesis_chapter1.odf thesis_chapter2.odf Thesis ProjectX
cp: omitting directory 'Thesis'
[student@desktopX Documents]$ cp -r Thesis ProjectX
[student@desktopX Documents]$ cp thesis_chapter2.odf Thesis/Chapter2/
[student@desktopX Documents]$ ls -R
.:
ProjectX ProjectY Thesis thesis_Chapter1.odf thesis_chapter2.odf
./ProjectX:
Thesis thesis_Chapter1.odf thesis_Chapter2.odf
./ProjectX/Thesis:
./ProjectY:
./Thesis:
Chapter1 Chapter2 Chapter3
./Thesis/Chapter1:
./Thesis/Chapter2:
thesis_Chapter2.odf
./Thesis/Chapter3:
[student@desktopX Documents]$
~~~
在第一个 cp 命令中,Thesis 未能被复制,但 thesis_chapter1.odf 和 thesis_chapter2.odf 复制成功。使用 -r 递归选项时,复制 Thesis 成功。
#### 移动文件
mv 命令在同一目录中重命名文件,或者将文件重新放到新的目录中。文件内容保持不变。将文件移动另一文件系统时要求通过复制源文件创建新的文件,然后再删除源文件。尽管通常对用户透明,但移动大型文件所需时间可能会明显较长。
~~~
[student@desktopX Videos]$ cd ../Documents
[student@desktopX Documents]$ ls -l
total 0
-rw-rw-r--. student student 0 Feb 8 16:24 thesis_chapter1.odf
-rw-rw-r--. student student 0 Feb 8 16:14 thesis_chapter2.odf
[student@desktopX Documents]$ mv thesis_chapter2.odf thesis_chapter2_reviewed.odf
[student@desktopX Documents]$ mv thesis_chapter1.odf Thesis/Chapter1
[student@desktopX Documents]$ ls -lR
.:
total 16
drwxrwxr-x. 2 student student 4096 Feb 11 11:58 ProjectX
drwxrwxr-x. 2 student student 4096 Feb 11 11:55 ProjectY
drwxrwxr-x. 5 student student 4096 Feb 11 11:56 Thesis
-rw-rw-r--. 1 student student 0 Feb 11 11:54 thesis_chapter2_reviewed.odf
./ProjectX:
total 0
-rw-rw-r--. 1 student student 0 Feb 11 11:58 thesis_chapter1.odf
-rw-rw-r--. 1 student student 0 Feb 11 11:58 thesis_chapter2.odf
./ProjectX/Thesis:
total 0
./ProjectY:
total 0
./Thesis:
total 12
drwxrwxr-x. 2 student student 4096 Feb 11 11:59 Chapter1
drwxrwxr-x. 2 student student 4096 Feb 11 11:56 Chapter2
drwxrwxr-x. 2 student student 4096 Feb 11 11:56 Chapter3
./Thesis/Chapter1:
total 0
-rw-rw-r--. 1 student student 0 Feb 11 11:54 thesis_chapter1.odf
./Thesis/Chapter2:
total 0
-rw-rw-r--. 1 student student 0 Feb 11 11:54 thesis_chapter2.odf
./Thesis/Chapter3:
total 0
[student@desktopX Documents]$
~~~
第一个 mv 命令时重命名文件的示例。第二个命令会导致文件重新放置到另外目录中。
#### 删除文件和目录
rm 的默认语法将删除文件,而不是目录。要删除目录以及其下可能存在的许多子目录和文件,需要使用 -r 递归选项。没有命令行取消删除功能,也没有可以从中恢复的垃圾箱。
~~~
[student@desktopX Documents]$ pwd
/home/student/Documents
[student@desktopX Documents]$ rm thesis_chapter2_reviewed.odf
[student@desktopX Documents]$ rm Thesis/Chapter1
rm: cannot remove 'Thesis/Chapter1': Is a directory
[student@desktopX Documents]$ rm -r Thesis/Chapter1
[student@desktopX Documents]$ ls -l Thesis
total 8
drwxrwxr-x. 2 student student 4096 Feb 11 12:47 Chapter2
drwxrwxr-x. 2 student student 4096 Feb 11 12:48 Chapter3
[student@desktopX Documents]$ rm -ri Thesis
rm: descend into directory 'Thesis'? y
rm: descend into directory 'Thesis/Chapter2'? y
rm: remove regular empty file 'Thesis/Chapter2/thesis_chapter2.opf' y
rm: remove directory 'Thesis/Chapter2'? y
rm: remove directory 'Thesis/Chapter3'? y
rm: remove directory 'Thesis'? y
[student@desktopX Documents]$
~~~
在 rm 未能删除 Chapter1 目录后,-r 递归选项成功执行了删除。最后一个 rm 命令首先解析到各个子目录,逐一删除其中包含的文件,然后删除各个现在为空的目录。如果使用 -i,则将以交互方式提示每个删除操作。这基本上与 -f 是相反的,后者将强制进行删除而不会提示用户。
rmdir 命令仅删除空的目录。删除的目录无法取消删除。
~~~
[student@desktopX Documents]$ pwd
/home/student/Documents
[student@desktopX Documents]$ rmdir ProjectY
[student@desktopX Documents]$ rmdir ProjectX
rmdir: failed to remove 'ProjectX': Directory not empty
[student@desktopX Documents]$ rm -r ProjectX
[student@desktopX Documents]$ ls -lR
.:
total 0
[student@desktopX Documents]$
~~~
rmdir 命令未能删除非空目录 ProjectX,但 rm -r 成功执行了删除。
### 参考
cp、mkdir、mv 和 rmdir man page