管理 Linux 的目录和文件

管理 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值