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

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

ls命令

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

基本用法

  • 不加任何参数,列出当前目录下的所有文件和目录,如:

    1
    2
    $ ls
    1.txt dir
  • 参数为文件时,列出文件,如:

    1
    2
    $ ls 1.txt
    1.txt
  • 参数为目录时,列出目录下的所有文件和目录,如:

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

常用选项

选项-F(flag)

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

1
2
3
$ls / -F
bin@ dev/ home/ lib64@ mnt/ proc/ run/ srv/ System/ usr/
boot/ etc/ lib@ lost+found/ opt/ root/ sbin@ sys/ tmp/ var/

长格式列表-l

看下面例子:

1
2
3
4
$ ls -l   
总用量 4
-rw-r--r-- 1 featherm featherm 0 6月 16 22:30 1.txt
drwxr-xr-x 2 featherm featherm 4096 6月 16 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等

1
2
3
4
$ ls -l -h 
总用量 4.0K
-rw-r--r-- 1 featherm featherm 0 6月 16 22:30 1.txt
drwxr-xr-x 2 featherm featherm 4.0K 6月 16 22:34 dir

选项-d

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

不加-d选项:

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

加上-d选项

1
2
$ ls -l -d /
drwxr-xr-x 18 root root 4096 5月 19 13:46 /

选项-a

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

1
2
$ 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:

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

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

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

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

1
2
3
4
5
$ 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:

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

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

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

复制目录dir为dir2:

1
2
3
4
5
6
7
$ 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:

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

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

1
2
3
4
5
6
7
8
$ 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:

1
2
3
$ rm tmp/2.txt 
$ ls tmp
dir2

删除tmp下的dir2整个目录:

1
2
3
$ rm -r tmp/dir2 
$ ls tmp
$

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

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

1
2
$ ls
1.txt 2.txt

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

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

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

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

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

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

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

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

1
2
3
$ rm -- -i
$ ls
$