Linux开发环境及应用·第四周·文件管理和目录管理(一)

本文整理了Linux文件与目录的管理相关知识

ls命令

ls命令用于列出目录下的文件与目录

基本用法

  • 不加任何参数,列出当前目录下的所有文件和目录,如:
    $ ls
    1.txt  dir
  • 参数为文件时,列出文件,如:
    $ ls 1.txt
    1.txt
  • 参数为目录时,列出目录下的所有文件和目录,如:
    $ tmp ls dir 
    2.txt  3.txt

常用选项

选项-F(flag)

目录后加/,可执行文件后加*,符号链接文件后加@,普通文件后无任何标记,如:

$ls / -F
bin@   dev/  home/  lib64@       mnt/  proc/  run/   srv/  System/  usr/
boot/  etc/  lib@   lost+found/  opt/  root/  sbin@  sys/  tmp/     var/
长格式列表-l

看下面例子:

$ ls -l   
总用量 4
-rw-r--r-- 1 featherm featherm    0  616 22:30 1.txt
drwxr-xr-x 2 featherm featherm 4096  616 22:34 dir

第1列:前面10个字符代表的意义如下:

  • 第1个字符 -=>普通文件,b=>块设备文件(Block),d=>目录文件(Dir),l=>符号连接文件(Link),c=>字符设备文件(Char),p=>命名管道文件(Pipe)
  • 文件的访问权限:r(Read)=>读权限,w(Write)=>写权限,x(eXecutable)=>可执行权限
    • 2-4字符:文件所有者对文件的访问权限
    • 5-7字符:同组用户对文件的访问权限
    • 8-10字符:其它用户对文件的访问权限

第2列:文件的link数,涉及到此文件的目录项数

第3,4列:文件主的名字和组名

第5列:

  • 普通磁盘文件:文件大小(单位为字节)
  • 目录:目录项的数目
  • 符号连接文件:符号连接文件自身的大小
  • 字符设备和块设备文件:主设备号和次设备号
  • 管道文件:管道内数据的长度

第6-8列:文件最后一次被修改的日期和时间+ 符号连接文件:符号连接文件自身的大小

  • 字符设备和块设备文件:主设备号和次设备号
  • 管道文件:管道内数据的长度

最后一列:文件名或目录名,对于符号连接文件附带连接文件的内容

选项 -h

以便于人阅读的方式打印数值,如文件大小1K,123M,1G等

$ ls -l -h 
总用量 4.0K
-rw-r--r-- 1 featherm featherm    0  616 22:30 1.txt
drwxr-xr-x 2 featherm featherm 4.0K  616 22:34 dir
选项-d

当ls的参数是目时,不列出目录下的项目,而是列出目录本身的信息

不加-d选项:

$ ls -l /
总用量 56
lrwxrwxrwx   1 root root     7  930  2018 bin -> usr/bin
drwxr-xr-x   4 root root  4096  612 13:32 boot
drwxr-xr-x  20 root root  3480  616 21:48 dev
drwxr-xr-x  94 root root  4096  616 21:34 etc
drwxr-xr-x   4 root root  4096  420 13:42 home
lrwxrwxrwx   1 root root     7  930  2018 lib -> usr/lib
lrwxrwxrwx   1 root root     7  930  2018 lib64 -> usr/lib
drwx------   2 root root 16384  420 13:21 lost+found
drwxr-xr-x   2 root root  4096  930  2018 mnt
drwxr-xr-x   6 root root  4096  526 13:54 opt
dr-xr-xr-x 172 root root     0  616 21:34 proc
drwxr-xr-x   7 root root  4096  51 16:48 root
drwxr-xr-x  25 root root   660  616 21:35 run
lrwxrwxrwx   1 root root     7  930  2018 sbin -> usr/bin
drwxr-xr-x   4 root root  4096  420 13:31 srv
dr-xr-xr-x  13 root root     0  616 21:34 sys
drwxr-xr-x   4 root root  4096  519 13:46 System
drwxrwxrwt  16 root root   420  616 22:26 tmp
drwxr-xr-x   9 root root  4096  612 15:35 usr
drwxr-xr-x  12 root root  4096  616 11:40 var

加上-d选项

$ ls -l -d /
drwxr-xr-x 18 root root 4096  519 13:46 /
选项-a

列出所有文件和目录,包括名字为圆点开头的项(默认隐藏不列出)

$ ls -a
.  ..  1.txt  dir

文件操作命令

文件复制命令cp

第一种用法:cp file1 file2 将文件file1复制为file2,文件file2若存在则覆盖
第二种用法:cp file1 file2 ... filen dir 将文件file1,file2,……,filen复制到目录dir下,目录dir必须存在

复制目录的正确用法(-r选项):cp -r dir1 dir2 若目录dir2存在,则将目录dir1整体复制到目录dir2下;若目录dir2不存在,则将目录dir1复制为目录dir2

移动文件命令mv

用法一:mv file1 file2 将文件file1移动( 更名)为file2
用法二:mv file1 file2 ... filen dir 将文件file1,file2,……,filen移动到目录dir下
用法三:mv dir1 dir2 若dir2不存在,则将目录dir1 更名 为dir2;若dir2存在,则将目录dir1整体移动到dir2下

删除命令rm

用法:rm file1 file2 ... filen
选项:

  • -r 若参数是目录,则递归(Recursive)删除目录
  • -i 每删除一个文件前询问是否确认
  • -f 强迫(Force)删除

注意:正在运行的可执行程序文件不能被删除

例子

假设一目录tmp下有文件1.txt和目录dir:

$ ls -l tmp
总用量 8
-rw-r--r-- 1 featherm featherm    6  617 11:01 1.txt
drwxr-xr-x 2 featherm featherm 4096  617 11:03 dir

复制文件1.txt为2.txt:

$ cp tmp/1.txt tmp/2.txt
$ ls tmp 
1.txt  2.txt  dir

复制文件1.txt,2.txt到目录dir下:

$ cp tmp/1.txt tmp/2.txt tmp/dir 
$ ls tmp
1.txt  2.txt  dir
$ ls tmp/dir 
1.txt  2.txt

将文件1.txt更名为3.txt:

$ ls tmp 
2.txt  3.txt  dir

将文件3.txt移动到dir下:

$ mv tmp/3.txt tmp/dir 
$ ls tmp 
2.txt  dir
$ ls tmp/dir 
1.txt  2.txt  3.txt

复制目录dir为dir2:

$ cp -r tmp/dir tmp/dir2 
$ ls tmp 
2.txt  dir  dir2
$ ls tmp/dir  
1.txt  2.txt  3.txt
$ ls tmp/dir2 
1.txt  2.txt  3.txt

将目录dir更名为dir3:

$ mv tmp/dir tmp/dir3
$ ls tmp 
2.txt  dir2  dir3

将目录dir3整体移动到目录dir2下:

$ mv tmp/dir tmp/dir3
$ ls tmp 
2.txt  dir2  dir3
$ mv tmp/dir3 tmp/dir2  
$ ls tmp 
2.txt  dir2
$ ls tmp/dir2 
1.txt  2.txt  3.txt  dir3

删除目录tmp下的2.txt:

$ rm tmp/2.txt 
$ ls tmp 
dir2

删除tmp下的dir2整个目录:

$ rm -r tmp/dir2 
$ ls tmp 
$  

显式区分命令选项和处理对象

假设当前目录下有文件1.txt和2.txt:

$ ls
1.txt  2.txt

利用管道创建一个名为-i的文件:

$ ls > -i
$ ls
1.txt  2.txt  -i

现打算执行rm *删除所有文件:

$ rm *              
rm:是否删除普通文件 '1.txt'?y
rm:是否删除普通文件 '2.txt'?y
$ ls
-i

上面例子实际上执行了命令rm 1.txt 2.txt -i,因为Linux中通配符是由shell展开后再传递展开后的参数给命令的,然而文件-i被rm命令解释成选项而不是操作的对象,所以-i文件没有成功删除

$ rm -i
rm: 缺少操作数
请尝试执行 "rm --help" 来获取更多信息。

同样的,直接执行rm -i也无法删除文件-i,因为-i被rm命令解释成选项了

解决问题的方法很简单,许多Linux命令如cp,ls,mv等,都支持用--显式地标记命令行选项的结束:

$ rm -- -i
$ ls
$