Linux常用命令--文件与目录的基本操作

摘要

  • 文件与目录的查看、创建、修改、删除等相关命令

  • 本文基于CentOS8(x86_64)

文件与目录的基本操作

1.查看目录下的内容:

1
2
3
4
5
6
7
8
ls .  : 查看当前路径下的文件,当前目录可以不加'.'
ls -1 : 注意这里是数字1,列表展示当前目录下的文件及目录的名称
ls -1 -c : 以更改时间(ctime)倒序,显示文件和目录,默认按字母排序
ls -l : -l以列表的形式显示详细信息,包括文件类型和权限、文件所属用户和用户组、最后修改时间等等
ls -al : -a显示所有文件包括隐藏文件以及当前目录(.)和上级目录(..),如果不希望展示这两个路径可以使用-A
ls -lh : 以人类便于理解的方式展示文件大小,K、M等等
ls dir : 查看指定目录下的文件
ls -l dir : 查看指定目录下的文件,列表展示
  • ls -l的默认按文件名称排序,排序方式是alphabetically(字典序),其规则大致为如下:
    1.数字排在字母前面
    2.忽视字母大小写
    3.无视数字和英文字母之外的字符

  • 文件大小排序列出文件清单

1
2
3
# 注意:只能排文件,目录大小默认4k,要连目录一块排序,请使用 du -sh * | sort -h
ls -lSh : 从大到小
ls -lShr : 从小到大
  • 时间排序列出文件清单

1
2
3
4
5
ls -lt : 按mtime从大到小
ls -ltr : 按mtime从小到大

ls -ltc : 按ctime从大到小
ls -ltcr : 按ctime从小到大

小贴士

  • 为了方便,通常会使用别名ll替代ls -l
1
2
3
4
5
6
7
8
$ which ll
alias ll='ls -l --color=auto'
/usr/bin/ls

$ ll
drwxr-xr-x 6 root root 4096 7月 23 2021 apache-maven-3.8.1
-rw-r--r-- 1 root root 9536838 3月 31 2021 apache-maven-3.8.1-bin.tar.gz
lrwxrwxrwx 1 root root 18 7月 23 2021 maven -> apache-maven-3.8.1

展示出来的信息可以分为7组,意思如下:
[1]:权限
[2]:连结
[3]:拥有者
[4]:群组
[5]:文件容量
[6]:修改日期
[7]:文件或目录名称

2.查看目录或文件的属性

1
2
ll -d dir :-d只显示目录信息
ll file :查看指定文件信息

3.切换目录

1
2
3
4
cd /  :切换到根目录
cd .. :回到上级目录
cd -  :返回到上一次访问的目录
cd dir:切换到指定目录

4.查看当前路径

1
pwd

5.创建空文件

1
touch filename :只创建不编辑

6.创建目录

1
2
mkdir dir
mkdir -p dir/dir/dir :创建多级目录

7.文件和目录复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cp sourcefile todir :复制到指定目录,保持原文件名

cp file1 file2 todir :同时复制多个文件到指定目录下

cp sourcefile todir/newfile :复制到指定目录,并重命名文件

# -R 选项只会递归复制文件和目录,但不会保留文件的所有属性。例如,它不会保留文件的权限、所有权和时间戳。
cp -R sourcedir todir :如果todir不存在,则将sourcedir下的内容复制到todir目录下,如果todir已经存在,则将sourcedir复制到todir目录下

cp sourcedir/* todir :复制目录下的文件到指定目录,不含sourcedir

cp -n sourcefile todir :如文件已经存在,则不覆盖

cp -f sourcefile todir :如文件已经存在,则强制覆盖

# 如果你想保留文件的所有属性,包括权限、所有权和时间戳等,那么最好使用 cp -a 命令,而不是 cp -R 命令
cp -a sourcedir todir :保持源文件的所有属性不变,并且以递归方式复制目录和子目录

8.移动文件、重命名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mv file1 file2 :重命名file1为file2

mv file todir :将文件移动到指定目录下

mv dir todir :如果todir不存在,则将dir重命名为todir,如果todir已经存在,则将dir移动到todir目录下

mv dir todir/ :如果todir不存在,则将dir重命名为todir,如果todir已经存在,则将dir移动到todir目录下

mv -n file todir :如有重复,则不覆盖

mv -f file todir :如有重复,则强制覆盖

# rename命令的功能是用于批量修改文件名称。与mv命令一次只能修改一个文件名不同,rename命令能够基于正则表达式对文件名进行批量修改
# 注意rename命令在centos和ubuntu下语法是不同的
# centos : rename <from> <to> *.txt
# 批量重命名,把/etc/yum.repos.d/*.repo指定的所有文件,文件名称中的‘.repo’替换为‘.repo.bak’
rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo

rename命令的参数有三项:
其一是当前文件名中要被修改的字符;
其二是其要被修改为的新字符;
其三是要被执行的对象文件列表,可以用正则表达式确定范围

# 后缀替换,当前路径下的所有.txt文件替换为.php
rename .txt .php *

# ubuntu : rename 's/from/to/' *.txt
rename 's/x0*/new/' *

小贴士
进行cpmv操作时,非重命名操作最好都先通过mkdir创建好目标目录

9.文件和目录删除

1
2
3
rm -f file : 删除文件

rm -rf dir : 删除目录

10.显示文件内容相关

cat :显示文件所有内容

1
cat file

将多行内容输入到文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 输出到文件
cat <<EOF > a.txt
<?xml version="1.0"?>
<items>
<item uid="localip" arg="$LOCAL">
<title>Local IP: $LOCAL</title>
<subtitle>Press Enter to paste, or Cmd+C to copy</subtitle>
<icon>icon.png</icon>
</item>
<item uid="externalip" arg="$EXTERNAL">
<title>External IP: $EXTERNAL</title>
<subtitle>Press Enter to paste, or Cmd+C to copy</subtitle>
<icon>icon.png</icon>
</item>
</items>
EOF

# 追加到文件
cat <<EOF >> a.txt
<?xml version="1.0"?>
<items>
<item uid="localip" arg="$LOCAL">
<title>Local IP: $LOCAL</title>
<subtitle>Press Enter to paste, or Cmd+C to copy</subtitle>
<icon>icon.png</icon>
</item>
<item uid="externalip" arg="$EXTERNAL">
<title>External IP: $EXTERNAL</title>
<subtitle>Press Enter to paste, or Cmd+C to copy</subtitle>
<icon>icon.png</icon>
</item>
</items>
EOF

more :分页显示文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
more file
下一页: 空格
下一行: 回车
退出 : q

选项 含义
-f 计算行数时,以实际的行数,而不是自动换行过后的行数。
-p 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容。
-c 跟 -p 选项相似,不同的是先显示内容再清除其他旧资料。
-s 当遇到有连续两行以上的空白行时,就替换为一行的空白行。
-u 不显示下引号(根据环境变量 TERM 指定的终端而有所不同)。
+n 从第 n 行开始显示文件内容,n 代表数字。
-n 一次显示的行数,n 代表数字。

head :显示文件前几行,默认是10行

1
head -20 file : 显示开头的20行

tail :显示文件最后几行,默认是10行

1
2
3
tail -20 file : 显示结尾的20行
tail -f file -n 100 : 动态显示文件内容,先显示最后100行内容,用于查看日志
tail -f file | grep key : 动态显示文件内容,配合grep使用,只显示关心的内容

less :与more类似,不过less更加高效,推荐使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
less file

选项 选项含义
-N 显示每行的行号。
-S 行过长时将超出部分舍弃。
-e 当文件显示结束后,自动离开。
-g 只标志最后搜索到的关键同。
-Q 不使用警告音。
-i 忽略搜索时的大小写。
-m 显示类似 more 命令的百分比。
-f 强迫打开特殊文件,比如外围设备代号、目录和二进制文件。
-s 显示连续空行为一行。
-b <缓冲区大小> 设置缓冲区的大小。
-o <文件名> 将 less 输出的内容保存到指定文件中。
-x <数字> 将【Tab】键显示为规定的数字空格。

more 和 less的区别
1、less可以按键盘上下方向键显示上下内容,而more不能通过上下方向键控制显示
2、less不必读整个文件,加载速度会比more更快
3、less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容
4、阅读到文件结束时,less不会退出,而more会
5、less可用行号或百分比作为书签浏览文件,而more不行
6、相比more,less提供更加友好的检索、高亮显示等操作

strings :查看二进制文件中可以读取的字符部分

1
strings /lib64/libc.so.6 | grep GLIBC

11.软链接与硬连接

1
2
ln -s file/dir file/dir : 软连接
ln file file : 硬连接

软链接 与 硬链接 的区别
软链接(soft link):也称为符号链接(Symbolic Link),类似于 Windows 操作系统中的快捷方式文件,该文件有自己的名称、inode 和 物理存储的文件数据(记录着另一文件的路径名指向),访问该文件会被重新定向到软链接所指的源文件名。

硬链接(hard link):相当于为当前文件名对应的文件再创建一个文件别名,当前文件名与该文件别名对应的 inode 和 物理存储的文件数据 都是一样的,访问该文件别名同访问当前文件名一致。

1.删除源文件,软链接 会失效(但不会被自动删除),硬链接 不会失效(文件并没有被真正删除);
2.软链接 可以为文件和目录(允许不存在)创建链接,硬链接 只可以为文件创建链接;
3.软链接 可以跨文件系统,硬链接 必须是同一个文件系统;
4.软链接 的文件权限 可以和源文件不一样,硬链接 的文件权限 一定和源文件一样;
5.软链接:作为可执行文件的快捷方式;
6.硬链接:备份重要文件。

12.查看文件或目录的大小

1
2
3
4
5
6
7
8
9
10
11
12
du -h file : 查看文件大小

du -sh dir : 查看目录大小

du -sh * : 查看当前目录下所有文件和目录的大小,只能显示当前目录下的非隐藏文件和文件夹的磁盘使用情况

du -sh .[^.]* : 查看隐藏文件和文件夹的磁盘使用情况

du -sh * .[^.]* : 查看所有文件和文件夹(包括隐藏的和非隐藏的)的磁盘使用情况

du -sh * | sort -h : 正序
du -sh * | sort -hr : 倒序

13.查看文件、目录详细时间参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stat file/dir : 列出访问时间,最后修改时间,等等
# 示例:
stat apache-maven-3.8.1-bin.tar.gz
文件:"apache-maven-3.8.1-bin.tar.gz"
大小:9536838 块:18632 IO 块:4096 普通文件
设备:fd01h/64769d Inode:1078257 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2023-03-03 10:06:52.371937028 +0800
最近更改:2021-03-31 01:41:19.000000000 +0800
最近改动:2021-07-23 15:25:42.624723562 +0800
创建时间:-

1. 最近访问(Access Time) :简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间。
2. 最近更改(Modify Time) :简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。就是 ls -l 里显示的时间。
3. 最近改动(Change Time) :简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。

小贴士
使用touch命令修改文件的时间戳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ touch --help
用法:touch [选项]... 文件...
Update the access and modification times of each FILE to the current time.

A FILE argument that does not exist is created empty, unless -c or -h
is supplied.

A FILE argument string of - is handled specially and causes touch to
change the times of the file associated with standard output.
Mandatory arguments to long options are mandatory for short options too.
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用指定字符串表示时间而非当前时间
-f (忽略)
-h, --no-dereference 会影响符号链接本身,而非符号链接所指示的目的地
(当系统支持更改符号链接的所有者时,此选项才有用)
-m 只更改修改时间
-r, --reference=FILE use this file's times instead of current time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
--time=WORD change the specified time:
WORD is access, atime, or use: equivalent to -a
WORD is modify or mtime: equivalent to -m
--help 显示此帮助信息并退出
--version 显示版本信息并退出

请注意,-d 和-t 选项可接受不同的时间/日期格式。

# 示例
# 修改atime
touch -a test : 修改为当前系统时间
touch -a -d "2023-03-02 11:37:08" test.sh : 修改为指定的时间
touch -a -t "202303021137.08" test.sh

# 修改mtime
touch -m test : 修改为当前系统时间
touch -m -d "2023-03-02 11:37:08" test.sh : 修改为指定的时间
touch -m -t "202303021137.08" test.sh

# 注意,修改atime或mtime时,都会同时修改ctime,因为文件的状态发生了变化

14.查看文件的MD5或SHA值

1
2
3
4
5
md5sum file

sha256sum file

sha512sum file

15.查看硬盘分区情况及其挂载点

1
2
3
4
5
6
7
df -h : 显示硬盘大小,自动使用最大的单位
df -Th : 同时显示分区类型

df -hl : 只显示本机的文件系统

df : 分区容量全部使用单位K,等同于 df -k
df -m : 分区容量全部使用单位M

16.将文件转换为16进制格式

1
2
3
4
5
# 转16进制
xxd file > 16file

# 16进制转回
xxd r 16file file

17.命令别名alias

  • 查看当前系统的别名

1
alias
  • 设置别名

1
alias ls='ls -l'
  • 永久有效

1
2
3
4
# 追加到bash启动脚本中,比如这里的~/.bashrc,也可以是/etc/profile,等等
echo "alias ls='ls -l'" >> ~/.bashrc
# 重新加载配置文件
source ~/.bashrc
  • 强制使用原始命令

1
2
3
4
5
6
7
8
# 比如我们查看cp,发现它被别名了,当你执行cp时,实际上执行的是cp -i,-i表示询问
whcih cp
# cp: aliased to cp -i
# 如果我们希望不询问,可以使用原始命令的cp,此时只需要在命令前加上'\'转义符
\cp file1 file2

# 还有我们上面自建的别名ls,如果希望使用原始命令,可以使用
\ls

18.创建指定大小的文件

  • 有时候我们基于测试需要,需要临时创建一个指定大小的文件,就可以使用如下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建一个100M的文件
dd if=/dev/zero of=testfile bs=1M count=100
# 创建一个1G的文件
dd if=/dev/zero of=testfile bs=1M count=1024
# if=/dev/zero: 从 /dev/zero(生成空字节的特殊文件)读取数据。
# of=testfile: 指定输出文件的名称。
# bs=1M: 设置块大小为 1MB。
# count=1024: 写入 1024 块(1MB * 1024 = 1GB)。

# 或者使用fallocate,速度最快,不实际写入数据,而是直接分配磁盘空间。
# 创建一个100M的文件
fallocate -l 100M testfile
# 创建一个1G的文件
fallocate -l 1G testfile
# -l 1G: 指定文件大小为 1GB。
# testfile: 输出文件名称。

19.查看命令的执行时间:time command

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ time dd if=/dev/zero of=testfile bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,9.42705 秒,114 MB/秒

real 0m9.429s
user 0m0.004s
sys 0m0.769s

$ time fallocate -l 1G testfile

real 0m0.002s
user 0m0.000s
sys 0m0.002s