文件基础操作 #

ls - 列出目录内容 #

基本用法 #

bash
# 列出当前目录内容
$ ls
Desktop  Documents  Downloads  Music  Pictures

# 列出指定目录
$ ls /home/user
$ ls /etc

# 列出多个目录
$ ls /home /var /tmp

常用选项 #

bash
# -l 长格式显示
$ ls -l
total 32
drwxr-xr-x  2 user user 4096 Apr 11 10:00 Desktop
drwxr-xr-x  3 user user 4096 Apr 11 09:30 Documents
-rw-r--r--  1 user user  220 Apr 10 15:00 file.txt

# -a 显示所有文件(包括隐藏文件)
$ ls -a
.  ..  .bashrc  .profile  Desktop  Documents

# -h 人类可读的文件大小
$ ls -lh
-rw-r--r--  1 user user 1.5K Apr 11 10:00 file.txt

# -R 递归列出子目录
$ ls -R
.:
Desktop  Documents

./Desktop:
file1.txt  file2.txt

# -t 按修改时间排序
$ ls -lt

# -S 按文件大小排序
$ ls -lS

# -r 反向排序
$ ls -lr

# -d 只显示目录本身
$ ls -d */
Desktop/  Documents/  Downloads/

# -i 显示 inode 号
$ ls -li
1234567 drwxr-xr-x  2 user user 4096 Apr 11 10:00 Desktop

输出格式详解 #

text
┌─────────────────────────────────────────────────────────────┐
│                      ls -l 输出解析                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   -rw-r--r--  1 user group 1234 Apr 11 10:00 file.txt       │
│    │││││││    │  │     │     │        │           │         │
│    │││││││    │  │     │     │        │           └── 文件名│
│    │││││││    │  │     │     │        └── 修改时间          │
│    │││││││    │  │     │     └── 文件大小(字节)            │
│    │││││││    │  │     └── 所属组                            │
│    │││││││    │  └── 所有者                                  │
│    │││││││    └── 硬链接数                                   │
│    │││││││                                                   │
│    ││││││└── 其他用户权限(读)                               │
│    │││││└── 其他用户权限(写)- 无                           │
│    ││││└── 其他用户权限(执行)- 无                          │
│    │││└── 组用户权限(读)                                   │
│    ││└── 组用户权限(写)- 无                                │
│    │└── 组用户权限(执行)- 无                               │
│    │└── 所有者权限(读)                                     │
│    └── 所有者权限(写)                                      │
│    └── 所有者权限(执行)- 无                                │
│    └── 文件类型(- 普通文件)                                │
│                                                             │
│   文件类型:                                                 │
│   - 普通文件    d 目录    l 符号链接    b 块设备             │
│   c 字符设备    p 管道    s 套接字                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

实用组合 #

bash
# 查看最近修改的文件
$ ls -lt | head -10

# 查找大文件
$ ls -lhS | head -10

# 只显示目录
$ ls -d */

# 显示文件类型指示符
$ ls -F
Desktop/  Documents/  file.txt  script.sh*

# 彩色输出
$ ls --color=auto

# 按扩展名排序
$ ls -lX

touch - 创建文件与更新时间戳 #

基本用法 #

bash
# 创建空文件
$ touch newfile.txt

# 创建多个文件
$ touch file1.txt file2.txt file3.txt

# 使用大括号批量创建
$ touch file{1..10}.txt
$ touch {a,b,c}.txt

更新时间戳 #

bash
# 更新访问时间和修改时间
$ touch file.txt

# 只更新访问时间
$ touch -a file.txt

# 只更新修改时间
$ touch -m file.txt

# 设置特定时间
$ touch -t 202604111200 file.txt    # 2026年4月11日12:00

# 使用参考文件的时间
$ touch -r reference.txt file.txt

# 查看时间戳
$ stat file.txt
  File: file.txt
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Access: 2026-04-11 12:00:00.000000000 +0800
Modify: 2026-04-11 12:00:00.000000000 +0800
Change: 2026-04-11 12:00:00.000000000 +0800

cp - 复制文件和目录 #

基本用法 #

bash
# 复制文件
$ cp source.txt destination.txt

# 复制到目录
$ cp file.txt /home/user/Documents/

# 复制多个文件到目录
$ cp file1.txt file2.txt /backup/

# 复制目录(递归)
$ cp -r source_dir/ destination_dir/

常用选项 #

bash
# -i 交互模式,覆盖前确认
$ cp -i file.txt /backup/
cp: overwrite '/backup/file.txt'? y

# -f 强制覆盖
$ cp -f file.txt /backup/

# -n 不覆盖已存在的文件
$ cp -n file.txt /backup/

# -v 显示详细信息
$ cp -v file.txt /backup/
'file.txt' -> '/backup/file.txt'

# -p 保留文件属性(权限、时间戳、所有者)
$ cp -p file.txt /backup/

# -u 只复制更新的文件(源文件比目标新)
$ cp -u file.txt /backup/

# -b 创建备份
$ cp -b file.txt /backup/
# 如果目标存在,创建 file.txt~

# --backup=numbered 创建编号备份
$ cp --backup=numbered file.txt /backup/
# 创建 file.txt.~1~

# -l 创建硬链接而非复制
$ cp -l file.txt hardlink.txt

# -s 创建符号链接而非复制
$ cp -s file.txt symlink.txt

实用示例 #

bash
# 备份文件
$ cp config.yaml config.yaml.bak

# 复制并重命名
$ cp oldname.txt newname.txt

# 复制整个项目
$ cp -r project/ project_backup/

# 复制时保留所有属性
$ cp -a source/ destination/

# 复制特定类型的文件
$ cp *.txt /backup/

# 复制并显示进度
$ cp -rv source/ destination/

mv - 移动和重命名 #

基本用法 #

bash
# 重命名文件
$ mv oldname.txt newname.txt

# 移动文件到目录
$ mv file.txt /home/user/Documents/

# 移动多个文件
$ mv file1.txt file2.txt /backup/

# 移动目录
$ mv olddir/ newdir/

常用选项 #

bash
# -i 交互模式
$ mv -i file.txt /backup/
mv: overwrite '/backup/file.txt'? y

# -f 强制覆盖
$ mv -f file.txt /backup/

# -n 不覆盖已存在的文件
$ mv -n file.txt /backup/

# -v 显示详细信息
$ mv -v file.txt /backup/
renamed 'file.txt' -> '/backup/file.txt'

# -u 只移动更新的文件
$ mv -u file.txt /backup/

# -b 创建备份
$ mv -b file.txt /backup/

批量重命名 #

bash
# 使用 rename 命令(Perl 版本)
$ rename 's/.txt/.bak/' *.txt

# 将小写改为大写
$ rename 'y/a-z/A-Z/' *.txt

# 添加前缀
$ rename 's/^/prefix_/' *.txt

# 添加后缀
$ rename 's/$/_backup/' *.txt

# 使用 mv 配合循环
$ for f in *.txt; do mv "$f" "${f%.txt}.bak"; done

# 使用 mmv(需要安装)
$ mmv '*.txt' '#1.bak'

rm - 删除文件和目录 #

基本用法 #

bash
# 删除文件
$ rm file.txt

# 删除多个文件
$ rm file1.txt file2.txt

# 删除目录(递归)
$ rm -r directory/

# 删除空目录
$ rmdir empty_directory/

常用选项 #

bash
# -i 交互模式
$ rm -i file.txt
rm: remove regular file 'file.txt'? y

# -f 强制删除
$ rm -f file.txt

# -r 递归删除目录
$ rm -r directory/

# -v 显示详细信息
$ rm -v file.txt
removed 'file.txt'

# -d 删除空目录
$ rm -d empty_dir/

# 组合使用(危险!)
$ rm -rf directory/    # 强制递归删除

安全删除 #

bash
# 使用 -i 确认每个文件
$ rm -ri directory/

# 使用 -I 确认超过 3 个文件时
$ rm -I *.txt

# 查看将要删除的文件
$ ls *.txt
$ rm *.txt

# 使用 find 安全删除
$ find . -name "*.tmp" -type f -delete

# 使用 trash-cli(安全删除到回收站)
$ trash file.txt
$ trash-list
$ trash-restore

删除特殊文件 #

bash
# 删除以 - 开头的文件
$ rm -- -file.txt
$ rm ./-file.txt

# 删除文件名包含空格的文件
$ rm "file name.txt"
$ rm file\ name.txt

# 删除文件名包含特殊字符的文件
$ rm 'file$name.txt'

# 使用 inode 删除
$ ls -li
12345 -rw-r--r-- 1 user user 0 Apr 11 10:00 weird?file
$ find . -inum 12345 -delete

file - 查看文件类型 #

基本用法 #

bash
# 查看文件类型
$ file document.pdf
document.pdf: PDF document, version 1.4

$ file image.png
image.png: PNG image data, 800 x 600, 8-bit/color RGB

$ file script.sh
script.sh: Bourne-Again shell script, ASCII text executable

$ file archive.tar.gz
archive.tar.gz: gzip compressed data

# 查看多个文件
$ file *

常用选项 #

bash
# -b 简洁输出
$ file -b document.pdf
PDF document, version 1.4

# -i 显示 MIME 类型
$ file -i document.pdf
document.pdf: application/pdf

# -f 从文件读取文件名列表
$ cat filelist.txt
file1.txt
file2.txt
$ file -f filelist.txt

# -z 查看压缩文件内部
$ file -z archive.tar.gz
archive.tar.gz: POSIX tar archive (GNU)

stat - 查看文件状态 #

基本用法 #

bash
# 查看文件详细信息
$ stat file.txt
  File: file.txt
  Size: 1234        Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: (1000/user)   Gid: (1000/user)
Access: 2026-04-11 10:00:00.000000000 +0800
Modify: 2026-04-11 09:30:00.000000000 +0800
Change: 2026-04-11 09:30:00.000000000 +0800
 Birth: -

# 查看文件系统信息
$ stat -f /
  File: "/"
    ID: 12345678-abcd-efgh-ijkl-mnopqrstuvwx Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 2621440    Free: 2097152     Available: 1966080
Inodes: Total: 1310720    Free: 1228800

格式化输出 #

bash
# 自定义输出格式
$ stat -c "%n: %s bytes" file.txt
file.txt: 1234 bytes

# 常用格式符
%n    文件名
%s    文件大小(字节)
%U    所有者用户名
%G    所属组名
%A    权限(字符)
%a    权限(数字)
%y    最后修改时间
%z    最后状态改变时间
%x    最后访问时间

# 示例
$ stat -c "%n | %A | %U:%G | %s" *
file.txt | -rw-r--r-- | user:user | 1234
script.sh | -rwxr-xr-x | user:user | 5678

ln - 创建链接 #

硬链接 #

bash
# 创建硬链接
$ ln file.txt hardlink.txt

# 硬链接特点
# - 指向相同的 inode
# - 删除原文件不影响硬链接
# - 不能跨文件系统
# - 不能链接目录

# 查看硬链接
$ ls -li file.txt hardlink.txt
1234567 -rw-r--r-- 2 user user 1234 Apr 11 10:00 file.txt
1234567 -rw-r--r-- 2 user user 1234 Apr 11 10:00 hardlink.txt
# 注意 inode 号相同,链接数为 2

符号链接 #

bash
# 创建符号链接
$ ln -s file.txt symlink.txt

# 符号链接特点
# - 指向文件路径
# - 可以跨文件系统
# - 可以链接目录
# - 删除原文件后链接失效

# 查看符号链接
$ ls -l symlink.txt
lrwxrwxrwx 1 user user 8 Apr 11 10:00 symlink.txt -> file.txt

# 创建目录的符号链接
$ ln -s /path/to/dir link_to_dir

# 创建指向相对路径的链接
$ ln -s ../config/app.conf current.conf

# 强制覆盖已存在的链接
$ ln -sf new_target link_name

链接对比 #

text
┌─────────────────────────────────────────────────────────────┐
│                    硬链接 vs 符号链接                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   特性              硬链接           符号链接                │
│   ─────────────────────────────────────────────────────     │
│   指向              inode            文件路径                │
│   跨文件系统        不可以           可以                    │
│   链接目录          不可以           可以                    │
│   原文件删除        仍可用           失效                    │
│   占用空间          无额外空间       小量空间                │
│   权限              与原文件相同     777(实际看原文件)      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

小结 #

通过本节学习,你应该掌握:

  1. ls:列出目录内容,各种排序和显示选项
  2. touch:创建文件和更新时间戳
  3. cp:复制文件和目录,保留属性
  4. mv:移动和重命名文件
  5. rm:删除文件和目录,安全删除技巧
  6. file:查看文件类型
  7. stat:查看文件详细状态
  8. ln:创建硬链接和符号链接

下一步,我们将学习目录操作命令。

最后更新:2026-04-11