Linux文件和目录操作命令

血红的双手。 提交于 2020-01-24 09:41:52

Linux文件和目录操作命令

基本列表功能

ls 命令最基本的形式会显示当前目录下的文件和目录:

[root@localhost /]# ls
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@localhost /]# 

注意, ls 命令输出的列表是按字母排序的(按列排序而不是按行排序)。如果用户用的是支持彩色的终端仿真器, ls 命令还可以用不同的颜色来区分不同类型的文件。

如果没安装彩色终端仿真器,可用带 -F 参数的 ls 命令轻松区分文件和目录。使用 -F 参数可以得到如下输出:

[root@localhost /]# ls -F
bin@   dev/  home/  lib64@       media/  opt/   root/  sbin@  sys/  usr/
boot/  etc/  lib@   lost+found/  mnt/    proc/  run/   srv/   tmp/  var/
[root@localhost /]# 

基本的 ls 命令在某种意义上有点容易让人误解。它显示了当前目录下的文件和目录,但并没有将全部都显示出来。Linux经常采用隐藏文件来保存配置信息。在Linux上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的 ls 命令输出中显示出来,因此我们称其为隐藏文件。

要把隐藏文件和普通文件及目录一起显示出来,就得用到 -a 参数。下面是一个带有 -a 参数的 ls 命令的例子:

[root@localhost /]# ls -a
.   bin   dev  home  lib64       media  opt   root  sbin  sys  usr
..  boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@localhost /]# 

所有以点号开头的隐藏文件现在都显示出来了。

-R 参数是 ls 命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中

的文件。如果目录很多,这个输出就会很长。以下是 -R 参数输出的简单例子:

[root@localhost tmp]# ls -F -R
.:
vmware-root_6364-960610127/  vmware-root_6366-968933069/
./vmware-root_6364-960610127:
./vmware-root_6366-968933069:
[root@localhost tmp]# 

显示长列表

在基本的输出列表中, ls 命令并未输出太多每个文件的相关信息。要显示附加信息,另一个常用的参数是 -l 。 -l 参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。

[root@localhost /]# ls -l
总用量 60
lrwxrwxrwx.  1 root root     7 12月 11 09:05 bin -> usr/bin
dr-xr-xr-x.  6 root root  4096 12月 31 09:59 boot
drwxr-xr-x. 19 root root  3180 1月   7 14:55 dev
drwxr-xr-x. 84 root root  4096 1月   7 14:55 etc
drwxr-xr-x.  2 root root  4096 4月  11 2018 home
lrwxrwxrwx.  1 root root     7 12月 11 09:05 lib -> usr/lib
lrwxrwxrwx.  1 root root     9 12月 11 09:05 lib64 -> usr/lib64
drwx------.  2 root root 16384 12月 11 09:05 lost+found
[root@localhost /]# 

这种长列表格式的输出在每一行中列出了单个文件或目录。除了文件名,输出中还有其他有

用信息。输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或目录)的下述信息:

  • 文件类型,比如目录( d )、文件( - )、字符型文件( c )或块设备( b );

  • 文件的权限;

  • 文件的硬链接总数;

  • 文件属主的用户名;

  • 文件属组的组名;

  • 文件的大小(以字节为单位);

  • 文件的上次修改时间;

  • 文件名或目录名;

处理文件

创建文件

你总会时不时地遇到要创建空文件的情况。例如,有时应用程序希望在它们写入数据之前,某个日志文件已经存在。这时,可用 touch 命令轻松创建空文件。

[root@localhost tmp]# touch touch-one
[root@localhost tmp]# ls -l touch-one 
-rw-r--r--. 1 root root 0 1月   7 15:59 touch-one
[root@localhost tmp]# 

touch 命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,因为 touch 命令只创建了一个空文件。

touch 命令还可用来改变文件的修改时间。这个操作并不需要改变文件的内容。

[root@localhost tmp]# ls -l touch-one 
-rw-r--r--. 1 root root 0 1月   7 15:59 touch-one
[root@localhost tmp]# touch touch-one 
[root@localhost tmp]# ls -l touch-one 
-rw-r--r--. 1 root root 0 1月   7 16:00 touch-one
[root@localhost tmp]# 

touch-one文件的修改时间从15:59变为了16:00。如果只想改变访问时间,可用 -a 参数。

[root@localhost tmp]# ls -l touch-one 
-rw-r--r--. 1 root root 0 1月   7 16:00 touch-one
[root@localhost tmp]# touch -a touch-one 
[root@localhost tmp]# ls -l touch-one 
-rw-r--r--. 1 root root 0 1月   7 16:00 touch-one
[root@localhost tmp]# ls -l --time=atime touch-one 
-rw-r--r--. 1 root root 0 1月   7 16:03 touch-one
[root@localhost tmp]# 

在上面的例子中,要注意的是,如果只使用 ls –l 命令,并不会显示访问时间。这是因为默认显示的是修改时间。要想查看文件的访问时间,需要加入另外一个参数: --time=atime 。有了这个参数,就能够显示出已经更改过的文件访问时间。

复制文件

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

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

cp source destination

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

[root@localhost tmp]# cp cp-one cp-two
[root@localhost tmp]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 1月   7 16:15 cp-one
-rw-r--r--. 1 root root 0 1月   7 16:16 cp-two
[root@localhost tmp]# 

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

[root@localhost tmp]# cp -i cp-one cp-two 
cp:是否覆盖"cp-two"? y
[root@localhost tmp]# 

如果需要将文件复制到一个新的文件夹中并且保存一样的名称,可以省略目标文件夹的文件名称。

[root@localhost tmp]# mkdir mk-cp-one
[root@localhost tmp]# cp cp-one mk-cp-one/
[root@localhost tmp]# ls -l mk-cp-one/
总用量 0
-rw-r--r--. 1 root root 0 1月   7 16:20 cp-one
[root@localhost tmp]# 

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

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

[root@localhost tmp]# cp -R mk-cp-one/ mk-cp-two/
[root@localhost tmp]# ls
cp-one  cp-two  mk-cp-one  mk-cp-two
[root@localhost tmp]# 

经过cp -R命令后,成功的复制了mk-cp-one文件夹的内容为mk-cp-two新的文件夹。

链接文件

链接文件是Linux文件系统的一个优势。如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:

  • 软链接(符号链接)

  • 硬链接

符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。

这两个通过符号链接在一起的文件,彼此的内容并不相同。

要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用 ln 命令以及 -s 选项来创建符号链接。

软链接命令格式 ls -s 源文件 软连接文件名称

[root@localhost tmp]# ls -l
总用量 4
drwxr-xr-x. 2 root root 4096 1月   7 16:57 ln-s-1
[root@localhost tmp]# ln -s ln-s-1/ ln
[root@localhost tmp]# ls -l
总用量 4
lrwxrwxrwx. 1 root root    7 1月   7 16:58 ln -> ln-s-1/
drwxr-xr-x. 2 root root 4096 1月   7 16:57 ln-s-1
[root@localhost tmp]# 

软链接文件和源文件是2个独立的文件,而且大小也不一致。证明是独立文件的方法就是查看文件的inode节点号。ls命令使用-i参数可以看到inode节点。

[root@localhost tmp]# ls -il
总用量 4
786452 lrwxrwxrwx. 1 root root    7 1月   7 16:58 ln -> ln-s-1/
786449 drwxr-xr-x. 2 root root 4096 1月   7 16:57 ln-s-1
[root@localhost tmp]# 

源文件的inode是786449,软链接文件的inode是786452。所以说明它们不是同一个文件。

硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用 ln 命令时不再需要加入额外的参数了。

[root@localhost tmp]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 1月   7 17:06 one
[root@localhost tmp]# ln one ln-one
[root@localhost tmp]# ls -il
总用量 0
786449 -rw-r--r--. 2 root root 0 1月   7 17:06 ln-one
786449 -rw-r--r--. 2 root root 0 1月   7 17:06 one
[root@localhost tmp]# 

在上面的例子中,我们使用 ls -li 命令显示了 one, ln-one的inode编号以及长列表。注意,带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件。还要注意的是,链接计数(列表中第三项)显示这两个文件都有两个链接。另外,它们的文件大小也一模一样。

只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。(简单说:硬链接只能链接同一块硬盘的文件,不可以跨硬盘使用硬链接。)

复制链接文件的时候一定要小心。如果使用 cp 命令复制一个文件,而该文件又已经被链接

到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。用不着复制链接文件,可以创建原始文件的另一个链接。同一个文件拥有多个链接,这完全没有问题。但是,千万别创建软链接文件的软链接。这会形成混乱的链接链,不仅容易断裂,还会造成各种麻烦。

由于硬链接的文件都是一样的信息,很难区别那个是硬链接文件,那个是源文件。所以不建议使用硬链接,推荐使用软链接,软连接使用ls命令的时候会有颜色标注。同时还有->符号指向源文件。

重命名文件

在Linux中,重命名文件称为移动(moving)。 mv 命令可以将文件和目录移动到另一个位置或重新命名。

[root@localhost tmp]# mv mv-1 mv-2
[root@localhost tmp]# ls
mv-2  one  tow
[root@localhost tmp]#

注意,移动文件会将文件名从mv-1更改为mv-2,但inode编号和时间戳保持不变。这是因为 mv只影响文件名。

也可以使用 mv 来移动文件的位置。

[root@localhost tmp]# mv one/1 tow/
[root@localhost tmp]# ls -l tow/
总用量 0
-rw-r--r--. 1 root root 0 1月   7 17:13 1
[root@localhost tmp]# 

在上例中,我们使用 mv 命令把文件1从/one移动到了/two。和刚才一样,这个操作并没有改变文件的inode编号或时间戳。唯一变化的就是文件的位置。/one目录下不再有文件1,因为它已经离开了原先的位置,这就是 mv 命令所做的事情。

和 cp 命令类似,也可以在 mv 命令中使用 -i参数 。这样在命令试图覆盖已有的文件时,你就会得到提示。

也可以使用 mv 命令移动文件位置并修改文件名称,这些操作只需一步就能完成。

[root@localhost tmp]# mv one/2 tow/t-2
[root@localhost tmp]# ls -il tow/
总用量 0
786451 -rw-r--r--. 1 root root 0 1月   7 17:13 1
786452 -rw-r--r--. 1 root root 0 1月   7 17:13 t-2
[root@localhost tmp]# 

在这个例子中,将文件2从目录/one中移动到了目录/two,并将名字改为t-2。文件的时间戳和inode编号都没有改变。改变的只有位置和名称。

也可以使用 mv 命令移动整个目录及其内容。

[root@localhost tmp]# mv one/ tow/
[root@localhost tmp]# ls
mv-2  tow
[root@localhost tmp]# ls -il tow/
总用量 4
786451 -rw-r--r--. 1 root root    0 1月   7 17:13 1
786449 drwxr-xr-x. 2 root root 4096 1月   7 17:20 one
786452 -rw-r--r--. 1 root root    0 1月   7 17:13 t-2
[root@localhost tmp]# 

目录内容没有变化。只有目录名发生了改变。将one目录整个移动到了tow目录中。

删除文件

在Linux中,删除(deleting)叫作移除(removing) 。bash shell中删除文件的命令是 rm 。 rm命令的基本格式非常简单。注意, -i 命令参数提示你是不是要真的删除该文件。bash shell中没有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用 rm 命令时,要养成总是加入 -i 参数的好习惯。

[root@localhost tmp]# ls 
mv-2  tow
[root@localhost tmp]# rm -i mv-2 
rm:是否删除普通空文件 "mv-2"?y
[root@localhost tmp]# ls
tow
[root@localhost tmp]# 

rm 命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用 -f 参数强制删除。

处理目录

创建目录

在Linux中,有些命令(比如 cp 命令)对文件和目录都有效,而有些只对目录有效。创建新目录需要使用一个特殊命令。

在Linux中创建目录很简单,用 mkdir 命令即可:

[root@localhost tmp]# mkdir one
[root@localhost tmp]# ls -il
总用量 4
786449 drwxr-xr-x. 2 root root 4096 1月   7 17:27 one
[root@localhost tmp]# 

系统创建了一个名为one的新目录。注意,新目录长列表是以d开头的。这表示one

并不是文件,而是一个目录。

可以根据需要批量地创建目录和子目录。但是,如果你想单单靠 mkdir 命令来实现,就会得到下面的错误消息:

[root@localhost tmp]# mkdir 1/2/3/
mkdir: 无法创建目录"1/2/3/": 没有那个文件或目录
[root@localhost tmp]# 

要想同时创建多个目录和子目录,需要加入 -p 参数:

[root@localhost tmp]# mkdir -p 1/2/3/
[root@localhost tmp]# ls
1  one
[root@localhost tmp]# 

mkdir 命令的 -p 参数可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。

删除目录

删除目录之所以很棘手,是有原因的。删除目录时,很有可能会发生一些不好的事情。shell会尽可能防止我们捅娄子。删除目录的基本命令是 rmdir 。

[root@localhost tmp]# ls
1  one
[root@localhost tmp]# rmdir one/
[root@localhost tmp]# 

默认情况下, rmdir 命令只删除空目录。因为我们在1目录下创建了2/3等目录,所以 rmdir 命令拒绝删除目录。会提示如下信息:

[root@localhost tmp]# rmdir 1
rmdir: 删除 "1" 失败: 目录非空
[root@localhost tmp]# 

要解决这一问题,得先把目录中的文件删掉,然后才能在空目录上使用 rmdir 命令。由于rmdir命令的复杂性,所以建议使用rm命令删除文件或者文件夹。如果已经确定要删除文件夹,可以使用rm -rf 文件夹名称 命令删除。注意,这个操作没有后悔药。

[root@localhost tmp]# ls
1
[root@localhost tmp]# rm -rf 1
[root@localhost tmp]# ls
[root@localhost tmp]# 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!