Linux 命令行 文件的处理
touch 创建文件
touch 命令用于创建空白文件。如果作用于一个已有文件,可以更改其修改时间。
如果只想改变访问时间,可用-a
参数:
$ touch -a test_one
ls -l --time=atime test_one
如果只使用 ls -l 命令,并不会显示访问时间。这是因为默认显示的是修改时间。要想查看文件的访问时间,需要加入另外一个参数:--time=atime。有了这个参数,就能够显示出已经更改过的文件的访问时间。
cp 复制文件
复制文件的格式为:
$ cp source destination
当 source 和 destination 参数都是文件名时,cp 命令将源文件复制成一个新文件,并且以 destination 命名。新文件就像全新的文件一样,有新的修改时间。
如果目标文件已经存在,cp 命令并不会提醒这一点。最好是加上-i
选项,强制 shell 询问是否需要覆盖已有文件。
也可以将文件复制到现有目录中。
$ cp -i test_one /home/christine/Documents/
新文件就出现在目录 Documents 中了,和源文件同名。
上面的例子在目标目录名尾部加上了一个正斜线(/),这表明 Documents 是目录而非文件。这有助于明确目的,而且在复制单个文件时非常重要。如果没有使用正斜线,子目录/home/christine/Documents 又不存在,就会有麻烦。在这种情况下,试图将一个文件复制到 Documents 子目录反而会创建一个名为 Documents 的文件,连错误消息都不会显示!
上一个例子采用了绝对路径,不过也可以使用相对路径。
本章在前面介绍了特殊符号可以用在相对文件路径中。其中的单点符(.)就很适合用于 cp 命令。记住,单点符表示当前工作目录。如果需要将一个带有很长的源对象名的文件复制到当前工作目录中时,单点符能够简化该任务。如果你的源对象名很长,使用单点符要比输入完整的目标对象名省事得多。
$ cp -i /etc/NetworkManager/NetworkManager.conf .
cp 命令的 -R 参数威力强大。可以用它在一条命令中递归地复制整个目录的内容:
$ ls -Fd *Scripts #-d选项只列出目录本身的信息,不列出其中的内容。一般可与 l 选项搭配显示目录自身详情
$ cp -R Scripts/ Mod_Scripts
在执行 cp -R 命令之前,目录 Mod_Scripts 并不存在。它是随着 cp -R 命令被创建的,整个 Scripts 目录中的内容都被复制到其中。注意,在新的 Mod_Scripts 目录中,所有的文件都有对应的新日期。Mod_Scripts 目录现在已经成为了 Scripts 目录的完整副本。
也可以在 cp 命令中使用通配符:
$ cp *script Mod_Scripts/
该命令将所有以 script 结尾的文件复制到 Mod_Scripts 目录中。
Tab]键 自动补全
如果你需要操作的文件/文件夹的名字很长,这正是制表键(Tab 键)自动补全挺身而出的时候。制表键自动补全允许你在输入文件名或目录名时按一下制表键,让 shell 帮忙将内容补充完整。
$ cp really_ridiculously_long_file_name Mod_Scripts/
在上面的例子中,我们输入了命令 cp really,然后按制表键,shell 就将剩下的文件名自动补充完整了。
使用制表键自动补全的的技巧在于要给 shell 足够的文件名信息,使其能够将需要文件同其他文件区分开。假如有另一个文件名也是以 really 开头,那么就算按了制表键,也无法完成文件名的自动补全。如果你的电脑有蜂鸣器,这时候你会听到蜂鸣器嘟的一声。要是再连按一下制表键,shell 就会列出所有以 really 开头的文件名。这个特性可以让你观察究竟应该输入哪些内容才能完成自动补全。
以上是对文件/文件夹的自动补全处理。如果希望对于 linux 命令也可以使用自动补全,在 Archlinux 上则需要额外安装包bash-completion
。
mv 移动/重命名文件
在 Linux 中,重命名文件称为移动(moving)。mv 命令可以将文件和目录移动到另一个位置或重新命名。
$ mv fall fzll #重命名
$ mv fzll Pictures/ #把文件fzll从/home/wallen移动到了/home/wallen/Pirctures
注意,mv 将文件名从 fall 更改为 fzll,但 inode 编号和时间戳保持不变。这是因为 mv 只影响文件名。 和 cp 命令类似,也可以在 mv 命令中使用-i
参数。这样在命令试图覆盖已有的文件时,你就会得到提示。
也可以使用 mv 命令移动文件位置并修改文件名称,这些操作只需一步就能完成:
$ mv /home/wallen/Pictures/fzll /home/wallen/fall
也可以使用 mv 命令移动整个目录及其内容:
$ mv Mod_Scripts Old_Scripts
rm 删除文件
bash shell 中删除文件的命令是 rm。rm 命令的基本格式非常简单。
$ rm -i fall
注意,-i 命令参数提示你是不是要真的删除该文件。bash shell 中没有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用 rm 命令时,要养成总是加入-i 参数的好习惯。也可以使用通配符删除成组的文件。别忘了使用-i 选项保护好自己的文件。
$ rm -i f?ll
rm: remove regular empty file 'fell'? y
rm: remove regular empty file 'fill'? y
rm: remove regular empty file 'full'? y
rm 命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用-f 参数强制删除。小心为妙!
ln 链接文件
链接文件是 Linux 文件系统的一个优势。如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为“链接”。链接是目录中指向文件真实位置的占位符。在 Linux 中有两种不同类型的文件链接:
- 符号链接(symbolic link)
- 硬链接(hard link)
“符号链接”就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。
要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用 ln 命令以及-s
选项来创建符号链接:
$ ln -s data_file sl_data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
lrwxrwxrwx 1 christine christine 9 May 21 17:29 sl_data_file -> data_file
在上面的例子中,注意符号链接的名字 sl_data_file 位于 ln 命令中的第二个参数位置上。显示在长列表中符号文件名后的->
符号表明该文件是链接到文件 data_file 上的一个符号链接。
另外,还要注意的是符号链接的文件大小与数据文件的文件大小。符号链接 sl_data_file 只有 9 个字节,而 data_file 有 1092 个字节。这是因为 sl_data_file 仅仅只是指向 data_file 而已。它们的内容并不相同,是两个完全不同的文件。
另一种证明链接文件是独立文件的方法是查看 inode 编号。文件或目录的 inode 编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。要查看文件或目录的 inode 编号,可以给 ls 命令加入-i 参数。
$ ls -i *data_file
296890 data_file
296891 sl_data_file
从这个例子中可以看出数据文件的 inode 编号是 296890,而 sl_data_file 的 inode 编号则是 296891,所以说它们是不同的文件。
当含有一连串符号链接的链接串时,不必一个一个用 ls 查看其链接关系,可以直接使用 readlink -f filename
指令查到当前符号链接串的原始文件是什么。
“硬链接”会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用 ln 命令时不再需要加入额外的参数了。
$ ln code_file hl_code_file
$ ls -li *code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 hl_code_file
在上面的例子中,我们使用 ls -li 命令显示了*code_files 的 inode 编号以及长列表。注意,带有硬链接的文件共享 inode 编号。这是因为它们终归是同一个文件。还要注意的是,链接计数(列表中第三项)显示这两个文件都有两个链接。另外,它们的文件大小也一模一样。
只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
复制链接文件的时候一定要小心。如果使用 cp 命令复制一个文件,而该文件又已经被链接(不论是符号链接还是硬链接)到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。其实用不着复制链接文件,可以创建原始文件的另一个链接。同一个文件拥有多个链接,这完全没有问题。但是,尽可能不要创建符号链接文件的符号链接。这会形成混乱的链接链,不仅容易断裂,还会造成各种麻烦。