管理 Linux 的目录和文件
今天我们来一起看看,管理 Linux 的目录和文件的命令:
ls
ls 命令用于列出文件夹内容,常见的选项有:
-a 选项,显示所有文件,包括隐藏文件
it@testsvra:~$ ls -a data/
. .. .bashrc_backup file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt .profile_backup test_folder
-A 选项,显示除 . 和 … 以外的所有文件
it@testsvra:~$ ls -A data/
.bashrc_backup file1.txt .file1.txt.swp file2.txt file3_back.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt .profile_backup test_folder
**-l ** 选项,表示以长格式的方式显示
it@testsvra:~$ ls -l data/
total 4
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file1.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file2.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file3.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file4.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file5.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file6.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file7.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file8.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:09 file9.txt
drwxrwxr-x 2 it it 4096 Feb 4 01:09 test_folder
-R 选项,递归显示
it@testsvra:~$ ls -R data/
data/:
file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt test_folder
data/test_folder:
fileA.txt fileB.txt fileC.txt fileD.txt fileE.txt fileF.txt fileG.txt
-d 选项,显示目录
it@testsvra:~$ ls -d data/
data/
-1 选项,分行显示
it@testsvra:~$ ls -1 data/
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
test_folder
-S 选项,从大到小排序
it@testsvra:~$ ls -lS data/
total 48
-rw-rw-r-- 1 it it 7657 Feb 4 01:21 file7.txt
-rw-rw-r-- 1 it it 6774 Feb 4 01:22 file6.txt
drwxrwxr-x 2 it it 4096 Feb 4 01:09 test_folder
-rw-rw-r-- 1 it it 3205 Feb 4 01:22 file3.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:20 file5.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:21 file8.txt
-rw-rw-r-- 1 it it 2406 Feb 4 01:19 file1.txt
-rw-rw-r-- 1 it it 1211 Feb 4 01:23 file2.txt
-rw-rw-r-- 1 it it 799 Feb 4 01:19 file9.txt
-rw-rw-r-- 1 it it 422 Feb 4 01:22 file4.txt
-t 选项,按文件时间的新旧排序(从新到旧,默认按 mtime 排序)
it@testsvra:~$ ls -lt data/
total 48
-rw-rw-r-- 1 it it 1211 Feb 4 01:23 file2.txt
-rw-rw-r-- 1 it it 6774 Feb 4 01:22 file6.txt
-rw-rw-r-- 1 it it 3205 Feb 4 01:22 file3.txt
-rw-rw-r-- 1 it it 422 Feb 4 01:22 file4.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:21 file8.txt
-rw-rw-r-- 1 it it 7657 Feb 4 01:21 file7.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:20 file5.txt
-rw-rw-r-- 1 it it 799 Feb 4 01:19 file9.txt
-rw-rw-r-- 1 it it 2406 Feb 4 01:19 file1.txt
drwxrwxr-x 2 it it 4096 Feb 4 01:09 test_folder
-u 选项,显示 atime 时间,可以与 -t 一起使用
it@testsvra:~$ ls -ltu data/
total 48
-rw-rw-r-- 1 it it 2406 Feb 4 01:17 file1.txt
drwxrwxr-x 2 it it 4096 Feb 4 01:10 test_folder
-rw-rw-r-- 1 it it 1211 Feb 4 01:09 file2.txt
-rw-rw-r-- 1 it it 3205 Feb 4 01:09 file3.txt
-rw-rw-r-- 1 it it 422 Feb 4 01:09 file4.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:09 file5.txt
-rw-rw-r-- 1 it it 6774 Feb 4 01:09 file6.txt
-rw-rw-r-- 1 it it 7657 Feb 4 01:09 file7.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:09 file8.txt
-rw-rw-r-- 1 it it 799 Feb 4 01:09 file9.txt
mkdir
mkdir 命令:创建文件夹。
如果父目录文件夹不存在,你需要添加 -p 选项,在父目录不存在时,先创建父目录,然后再创建文件夹
it@testsvra:~$ mkdir test/folder1
mkdir: cannot create directory ‘test/folder1’: No such file or directory
it@testsvra:~$ mkdir -p test/folder1
-m 选项,创建文件夹时,指定文件夹权限
it@testsvra:~$ mkdir -m o=rwx,g=rx,o=- test
it@testsvra:~$ ls -ld test/
drwxr-x--- 2 it it 4096 Feb 4 05:59 test/
touch
touch 命令:如果文件不存在,创建文件,如果文件存在,刷新文件的时间(默认三个时间都刷新。)
通过 touch 创建文件
it@testsvra:~$ touch f1
it@testsvra:~$ ls
f1
it@testsvra:~$ touch `date -d "-1day" +"%F_%T"`.log
it@testsvra:~$ ls
2021-02-02_15:54:36.log f1
-a 选项,仅改变 atime 和 ctime
it@testsvra:~$ stat data
File: data
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 804h/2052d Inode: 1966104 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2021-02-03 14:27:54.230148063 +0800
Modify: 2021-02-03 14:27:51.238147900 +0800
Change: 2021-02-03 14:27:51.238147900 +0800
Birth: -
it@testsvra:~$ touch -a data/
it@testsvra:~$ stat data
File: data
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 804h/2052d Inode: 1966104 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2021-02-03 15:29:20.530348905 +0800
Modify: 2021-02-03 14:27:51.238147900 +0800
Change: 2021-02-03 15:29:20.530348905 +0800
Birth: -
-m 选项,仅改变 mtime 和 ctime
it@testsvra:~$ touch -m data/
it@testsvra:~$ stat data
File: data
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 804h/2052d Inode: 1966104 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2021-02-03 15:29:20.530348905 +0800
Modify: 2021-02-03 15:29:37.982349856 +0800
Change: 2021-02-03 15:29:37.982349856 +0800
Birth: -
-t 选项,指定文件的 atime 和 mtime,格式 YYYYMMDDHHMM.SS
it@testsvra:~$ touch -t 202010211541.45 data/
it@testsvra:~$ stat data/
File: data/
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 804h/2052d Inode: 1966104 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2020-10-21 15:41:45.000000000 +0800
Modify: 2020-10-21 15:41:45.000000000 +0800
Change: 2021-02-03 15:34:47.322366710 +0800
Birth: -
cp
cp 命令:复制文件或目录
it@testsvra:~$ cp fa folder/
* 直接复制文件或目录,文件或目录的属性会发生改变
-i 选项,交互式方式运行(如果文件已经存在,提示是否覆盖。)
it@testsvra:~$ cat data/f1
Hello
it@testsvra:~$ cat f1
Hi
it@testsvra:~$ cp -i f1 data/f1
cp: overwrite 'data/f1'? n
it@testsvra:~$ cat data/f1
Hello
it@testsvra:~$ cp -i f1 data/f1
cp: overwrite 'data/f1'? y
it@testsvra:~$ cat data/f1
Hi
-n 选项,如果文件存在,不覆盖
it@testsvra:~$ cat f1
server
it@testsvra:~$ cat data/f1
Hi
it@testsvra:~$ cp -n f1 data/
it@testsvra:~$ cat data/f1
Hi
-p 选项,同 –preserve=mode,ownership,timestamps 附加额外的属性(mode,ownership,timestamp)
it@testsvra:~$ stat f1
File: f1
Size: 7 Blocks: 8 IO Block: 4096 regular file
Device: 804h/2052d Inode: 1966090 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2021-02-03 16:13:30.082493261 +0800
Modify: 2021-02-03 16:13:27.794493137 +0800
Change: 2021-02-03 16:13:27.794493137 +0800
Birth: -
it@testsvra:~$ cp data/
cp: missing destination file operand after 'data/'
Try 'cp --help' for more information.
it@testsvra:~$ cp f1 data/
it@testsvra:~$ stat data/f1
File: data/f1
Size: 7 Blocks: 8 IO Block: 4096 regular file
Device: 804h/2052d Inode: 1966088 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2021-02-03 16:10:45.282484282 +0800
Modify: 2021-02-03 16:24:30.510529244 +0800
Change: 2021-02-03 16:24:30.510529244 +0800
Birth: -
it@testsvra:~$ cp -p f1 data/
it@testsvra:~$ stat data/f1
File: data/f1
Size: 7 Blocks: 8 IO Block: 4096 regular file
Device: 804h/2052d Inode: 1966088 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ it) Gid: ( 1000/ it)
Access: 2021-02-03 16:13:30.082493261 +0800
Modify: 2021-02-03 16:13:27.794493137 +0800
Change: 2021-02-03 16:26:13.446534852 +0800
Birth: -
* 加 -p 选项之前,复制后的文件时间戳等等信息都发生了改变,-p 之后,复制后的文件时间戳等信息都没有发生改变。
-p 选项,在某些情况下,不能保存复制文件的所有者和所有组,如,普通用户使用 cp -p 去复制一个属于 root 用户的文件,虽然可以复制,但新文件的所有者和所有组都会发生改变:
it@testsvra:~$ ls -l /etc/issue
-rw-r--r-- 1 root root 25 Feb 1 13:46 /etc/issue
it@testsvra:~$ cp -p /etc/issue data/
it@testsvra:~$ ls -l data/issue
-rw-r--r-- 1 it it 25 Feb 1 13:46 data/issue
-a 选项,同 -dR --preserve=all,用于文件归档
通过 -r 选项,复制文件夹
it@testsvra:~$ cp data/ it/
cp: -r not specified; omitting directory 'data/'
it@testsvra:~$ cp -r data/ it/
it@testsvra:~$ ls it/
data
-v 选项,显示复制的过程
it@testsvra:~$ cp -v f1 data/
'f1' -> 'data/f1'
-f 选项,强制复制(不管文件是否存在,直接覆盖)
-u 选项,只复制目标位置不存在的文件
it@testsvra:~$ ls data/
file1.txt file2.txt file3.txt file4.txt file5.txt
it@testsvra:~$ cp -uv file[1-9].txt data/
'file6.txt' -> 'data/file6.txt'
'file7.txt' -> 'data/file7.txt'
'file8.txt' -> 'data/file8.txt'
'file9.txt' -> 'data/file9.txt'
it@testsvra:~$ ls data/
file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt
it@testsvra:~$
* 从复制的过程,我们可以看出,只复制了不存在的文件
-b 选项,如果文件已经存在,在目标文件后面添加 ~ 再复制
it@testsvra:~$ cp -b f1 data/
it@testsvra:~$ ls data/
f1 f1~
* 但 -b 选项只能保留一份(前一个版本)
-backup=numbered 选项,如果文件已经存在,在目标文件后面添加标识符,备份文件,然后再复制(可以备份多份)
it@testsvra:~$ ls data/
f1
it@testsvra:~$ cp --backup=numbered f1 data/
it@testsvra:~$ ls data/
f1 f1.~1~
it@testsvra:~$ cp --backup=numbered f1 data/
it@testsvra:~$ ls data/
f1 f1.~1~ f1.~2~
it@testsvra:~$ cp --backup=numbered f1 data/
it@testsvra:~$ ls data/
f1 f1.~1~ f1.~2~ f1.~3~
在 Redhat 系的 Linux 中,如果是 root 用户,运行 cp 命令,相当于运行 cp -i:
[root@serverb ~]# alias cp
alias cp='cp -i'
当普通用户复制所有者为 root 的文件,不管是添加 -p 选项,还是 -a 选项,新文件的所有者都会发生改变
it@testsvra:~$ ls -l f2
-rw-r--r-- 1 root root 0 Feb 2 13:26 f2
it@testsvra:~$ cp f2 folder/
it@testsvra:~$ ls -l folder/f2
-rw-r--r-- 1 it it 0 Feb 2 13:26 folder/f2
mv
mv 命令:移动文件或更更改文件名
it@testsvra:~$ ls -l file1.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:39 file1.txt
it@testsvra:~$ ls -l data/file1.txt
-rw-rw-r-- 1 it it 2406 Feb 4 01:19 data/file1.txt
it@testsvra:~$ mv file1.txt data/
it@testsvra:~$ ls -l data/file1.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:39 data/file1.txt
* 默认情况下,如果目标路径存在相同的名称的文件,会直接覆盖;
-i 选项,以交互式的方式(如果文件已经存在,提示你是否覆盖。):
it@testsvra:~$ mv -i file1.txt data/
mv: overwrite 'data/file1.txt'? y
* 输入 y 按回车,表示覆盖,如果输入 n 并回车,表示不覆盖,放弃移动。
-b 选项,如果文件已经存在,先备份文件(重命名,在文件名后面加 ~),然后再移动:
it@testsvra:~$ mv -b file3.txt data/
it@testsvra:~$ ls -l data/
total 44
-rw-rw-r-- 1 it it 0 Feb 4 01:44 file1.txt
-rw-rw-r-- 1 it it 1211 Feb 4 01:23 file2.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:46 file3.txt
-rw-rw-r-- 1 it it 3205 Feb 4 01:22 file3.txt~
-rw-rw-r-- 1 it it 422 Feb 4 01:22 file4.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:20 file5.txt
-rw-rw-r-- 1 it it 6774 Feb 4 01:22 file6.txt
-rw-rw-r-- 1 it it 7657 Feb 4 01:21 file7.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:21 file8.txt
-rw-rw-r-- 1 it it 799 Feb 4 01:19 file9.txt
drwxrwxr-x 2 it it 4096 Feb 4 01:09 test_folder
移动文件或目录时,源路径和目标路径在同一个分区的速度将比源路径和目标路径不在同一个分区的块
当执行 mv 命令时,如果源文件和目标文件位于同一个路径,则就变成了重命名:
it@testsvra:~$ mv data/file3.txt~ data/file3_back.txt
it@testsvra:~$ ls -l data/
total 44
-rw-rw-r-- 1 it it 0 Feb 4 01:44 file1.txt
-rw-rw-r-- 1 it it 1211 Feb 4 01:23 file2.txt
-rw-rw-r-- 1 it it 3205 Feb 4 01:22 file3_back.txt
-rw-rw-r-- 1 it it 0 Feb 4 01:46 file3.txt
-rw-rw-r-- 1 it it 422 Feb 4 01:22 file4.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:20 file5.txt
-rw-rw-r-- 1 it it 6774 Feb 4 01:22 file6.txt
-rw-rw-r-- 1 it it 7657 Feb 4 01:21 file7.txt
-rw-rw-r-- 1 it it 3045 Feb 4 01:21 file8.txt
-rw-rw-r-- 1 it it 799 Feb 4 01:19 file9.txt
drwxrwxr-x 2 it it 4096 Feb 4 01:09 test_folder
在 Redhat 系的 Linux 中,如果是 root 用户,运行 mv 命令,相当于运行 mv -i:
[root@serverb ~]# alias mv
alias mv='mv -i'
补充:
通过 rename 命令进行批量更改文件名
rename 命令在不同发行版本的 Linux 上,使用方法也不同:
在 Redhat 系 Linux 版本中的使用:
[student@serverb ~]$ ls
data file2.txt file4.txt file6.txt file8.txt
file1.txt file3.txt file5.txt file7.txt file9.txt
[student@serverb ~]$ rename txt _back.txt f*
[student@serverb ~]$ ls
data file2._back.txt file4._back.txt file6._back.txt file8._back.txt
file1._back.txt file3._back.txt file5._back.txt file7._back.txt file9._back.txt
在 Debian 系 Linux 版本中国的使用:
it@testsvra:~/data$ ls
file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt test_folder
it@testsvra:~/data$ rename s/.txt/_back.txt/ *.txt
it@testsvra:~/data$ ls
file1_back.txt file2_back.txt file3_back.txt file4_back.txt file5_back.txt file6_back.txt file7_back.txt file8_back.txt file9_back.txt test_folder
* 注意格式,s/.txt/_back.txt/ 最后面的 / 一定不能忘了,不然会报错
rm
rm 命令:删除命令
it@testsvra:~$ rm f2
-i 选项,交互式方式(会让你确认是否删除文件)
it@testsvra:~$ rm -i text_tmp
rm: remove regular file 'text_tmp'? y
* 输入 y 表示继续执行删除,输入 n 表示退出,不执行删除
通过 -f 选项,强制删除文件,并且没有交互式的确认提醒
通过 **rm -rf *** 删除当前目录下的所有文件(不包含隐藏文件。)
it@testsvra:~$ rm -rf *
it@testsvra:~$ ls
在 Redhat 系的 Linux 中,如果是 root 用户,运行 rm 命令,相当于运行 rm -i:
[root@serverb ~]# alias rm
alias rm='rm -i'
在生产环境中,尽量使用 mv 命令代理 rm 命令,将要删除的文件,通过 mv 移动到临时(/tmp)目录中
补充:
rm 删除文件,在大多数情况下,依然可以被恢复,在安全要求较高的情况下,我们可以使用 shred 命令进行删除文件:
-v 选项,显示运行过程
-u 选项,覆盖后,删除文件
-n 选项,指定覆盖的次数,默认是 3 次
it@testsvra:~$ shred -vun 5 test.txt
shred: test.txt: pass 1/5 (random)...
shred: test.txt: pass 2/5 (000000)...
shred: test.txt: pass 3/5 (random)...
shred: test.txt: pass 4/5 (ffffff)...
shred: test.txt: pass 5/5 (random)...
shred: test.txt: removing
shred: test.txt: renamed to 00000000
shred: 00000000: renamed to 0000000
shred: 0000000: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: test.txt: removed
rmdir
rmdir 命令,删除空目录
it@testsvra:~$ ls test/
folder1
it@testsvra:~$ rmdir test/
rmdir: failed to remove 'test/': Directory not empty
it@testsvra:~$ ls test/folder1/
it@testsvra:~$ rmdir test/folder1/
it@testsvra:~$ ls test/
tree
tree 命令,显示目录结构
it@testsvra:~$ tree folder/
folder/
├── itinfo
│ ├── conf1
│ ├── conf2
│ ├── conf3
│ ├── conf4
│ └── conf5
└── testdir
├── f1
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
├── f2
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
└── f3
├── file1
├── file2
├── file3
├── file4
└── file5
5 directories, 20 files
* 在某些发行版本中,tree 命令需要单独安装
如果只想看到目录,不想看到目录下的文件,你可以通过 -d 选项进行过滤:
it@testsvra:~$ tree -d folder/
folder/
├── itinfo
└── testdir
├── f1
├── f2
└── f3
5 directories