文件基础操作 #
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(实际看原文件) │
│ │
└─────────────────────────────────────────────────────────────┘
小结 #
通过本节学习,你应该掌握:
- ls:列出目录内容,各种排序和显示选项
- touch:创建文件和更新时间戳
- cp:复制文件和目录,保留属性
- mv:移动和重命名文件
- rm:删除文件和目录,安全删除技巧
- file:查看文件类型
- stat:查看文件详细状态
- ln:创建硬链接和符号链接
下一步,我们将学习目录操作命令。
最后更新:2026-04-11