一、目录导航与查看
1.1 pwd - 显示当前目录
命令格式:
bash
pwd [选项]
参数详解:
-L:显示逻辑路径(跟踪符号链接,默认)-P,:显示物理路径(解析所有符号链接)
使用示例:
bash
# 基本使用
pwd # 显示当前目录
/usr/local/bin
# 解析符号链接
ln -s /usr/bin /usr/local/bin
cd /usr/local/bin
pwd # 输出:/usr/local/bin
pwd -P # 输出:/usr/bin
# 脚本中使用
current_dir=$(pwd) # 保存当前目录到变量
echo "当前在:$(pwd)" # 在脚本中显示路径
1.2 ls - 列出目录内容
命令格式:
bash
ls [选项] [文件或目录...]
参数详解:
-a:显示所有文件,包括隐藏文件(以.开头的文件)-A:显示除.和...外的所有文件-d:只显示目录本身,不显示内容-F:添加文件类型标识符(*/=@|)-i:显示文件的inode编号-l:长格式显示,显示详细信息-h:人类可读的文件大小(K、M、G)-R:递归显示子目录内容
使用示例:
bash
# 基本使用
ls # 列出当前目录
ls /home/user # 列出指定目录
ls file.txt dir/ # 列出指定文件和目录
# 组合使用
ls -la # 长格式显示所有文件
ls -lh ~ # 人类可读大小显示家目录
ls -ltr /var/log # 按时间反向排序显示日志
ls -d */ # 只显示当前目录的子目录
ls -R project/ # 递归显示项目目录结构
# 高级使用
ls -l --time-style=full-iso # 完整ISO时间格式
ls --color=always /etc # 强制彩色显示
ls -lS | head -10 # 显示最大的10个文件
ls -la | grep '^d' # 只显示目录
1.3 cd - 切换目录
命令格式:
bash
cd [目录路径]
特殊符号:
~:用户家目录-:前一个工作目录..:上级目录.:当前目录
使用示例:
bash
# 基本切换
cd /usr/local # 切换到绝对路径
cd ../src # 切换到上级目录的src
cd ~/Documents # 切换到家目录的Documents
# 特殊用法
cd - # 返回上一个目录
cd # 回家目录
cd ~otheruser # 切换到其他用户家目录(需权限)
# 快捷技巧
cd !$ # 使用上条命令的最后一个参数
mkdir newdir && cd $_ # 创建目录并进入
cd /usr/../usr/local/.. # 复杂的路径导航
二、文件与目录操作
2.1 mkdir - 创建目录
命令格式:
bash
mkdir [选项] 目录名
参数详解:
-m:创建目录时直接设置权限模式-p:递归创建目录,若父目录不存在则一并创建-v:显示创建过程
使用示例:
bash
# 基本创建目录
mkdir documents
# 结果:在当前目录创建 documents 文件夹
# 创建多个目录
mkdir dir1 dir2 dir3
# 结果:同时创建 dir1, dir2, dir3 三个目录
# 使用 -m 参数设置权限
mkdir -m 755 public_html
# 结果:创建 public_html 目录,权限为 drwxr-xr-x
# 使用 -m 参数详细权限设置
mkdir -m u=rwx,g=rx,o= shared
# 结果:创建 shared 目录,权限 drwxr-x---
# 所有者:读写执行(rwx),组:读执行(r-x),其他:无权限(---)
# 使用 -p 参数递归创建目录
mkdir -p project/src/main/java
# 结果:创建 project/src/main/java 目录结构
# 如果 project 目录不存在,会自动创建
# -m 和 -p 组合使用
mkdir -pm 750 /var/www/site/logs
# 结果:创建 /var/www/site/logs 目录结构,权限为 drwxr-x---
# 创建目录并设置粘滞位
mkdir -m 1777 /tmp/shared_tmp
# 结果:创建目录,权限为 drwxrwxrwt
# 最后一位 t 表示粘滞位,只有文件所有者才能删除
# 验证创建结果
ls -ld project/ public_html/
# 显示目录详情和权限
2.2 rmdir - 删除空目录
命令格式:
bash
rmdir [选项] 目录名
参数详解:
-p:递归删除空目录-v:显示删除过程-v:显示创建过程
使用示例:
bash
# 创建测试目录结构
mkdir -p a/b/c
# 删除空目录(失败,因为c非空)
rmdir a/b/c
# 结果:失败,目录非空
# 先删除子目录
rmdir a/b/c
rmdir a/b
rmdir a
# 结果:逐级删除空目录
# 使用 -p 参数递归删除空目录
mkdir -p x/y/z
rmdir -p x/y/z
# 结果:删除 z -> 删除 y -> 删除 x
# 如果目录非空,则停止删除
2.3 rm - 删除文件或目录
命令格式:
bash
rm [选项] 文件或目录
参数详解:
-f:强制删除,不提示-i:交互式删除,删除前询问-r:递归删除目录-v:显示删除过程-d:删除空目录
使用示例:
bash
# 删除文件
rm file.txt # 删除单个文件
rm file1.txt file2.txt # 删除多个文件
rm *.tmp # 删除所有tmp文件
# 删除目录
rm -r directory/ # 递归删除目录
rm -d empty_dir/ # 删除空目录
rm -rf empty_dir/ # 强制递归删除
# 安全删除
rm -i important.txt # 删除前询问
# 显示删除过程
rm -v old_backup.tar.gz
# 输出:removed 'old_backup.tar.gz'
2.4 cp - 复制文件或目录
命令格式:
bash
cp [选项] 源文件... 目标目录
参数详解:
-a:归档模式,相当于 -dR --preserve=all-d:保持链接属性-i:覆盖前询问-f:强制覆盖,不询问-n:不覆盖已存在文件-p:保持文件属性(权限、时间戳等)-l:创建硬链接而非复制-r:递归复制目录-s:创建符号链接-u:只复制较新的文件-v:显示复制过程-t:指定目标目录
使用示例:
bash
# 基本复制
cp file.txt backup.txt # 复制文件
cp -r dir1/ dir2/ # 递归复制目录
# 保留属性
cp -a /etc /backup/etc # 归档模式复制
cp -p important.txt backup/ # 保留权限和时间戳
# 交互式复制
cp -i *.txt ~/Documents/ # 覆盖前询问
# 强制复制
cp -f source.txt dest.txt # 直接覆盖,不询问
# 只复制较新文件
cp -uv *.log /var/log/archive/
# 创建链接而非复制
cp -l large_file.dat backup/ # 创建硬链接
cp -s /usr/bin/python3 python # 创建符号链接
# 指定目标目录
cp -t /backup/ file1 file2 file3
# 备份控制
cp --backup=numbered config.conf # 创建带编号的备份
cp -b -S .bak file.txt # 备份文件加.bak后缀
2.5 mv - 移动或重命名文件
命令格式:
bash
mv [选项] 源文件... 目标目录
参数详解:
-b:覆盖前备份-f:强制移动,覆盖不询问-i:交互式移动,覆盖前询问-n:不覆盖已存在文件-u:只移动更新的文件-t:指定目标目录-v:显示移动过程
使用示例:
bash
# 重命名文件
mv oldname.txt newname.txt
# 结果:文件重命名为 newname.txt
# 移动文件到目录
mv newname.txt documents/
# 结果:documents/newname.txt
# 移动多个文件到目录
mv file1.txt file2.txt file3.txt archive/
# 交互式移动(覆盖前询问)
mv -i source.txt dest.txt
# 如果 dest.txt 存在,会询问是否覆盖
# 强制移动
mv -f source.txt dest.txt
# 直接覆盖,不询问
# 移动时备份
mv -b source.txt dest.txt
# 如果 dest.txt 存在,会备份为 dest.txt~
# 指定备份后缀
mv --suffix=.bak source.txt dest.txt
# 备份为 dest.txt.bak
# 只移动更新的文件
mv -u newfile.txt oldfile.txt
# 只有当 newfile.txt 比 oldfile.txt 新时才移动
# 显示移动过程
mv -v *.txt documents/
# 结果:
# 'file1.txt' -> 'documents/file1.txt'
# 'file2.txt' -> 'documents/file2.txt'
# 移动目录
mv olddir/ newdir/
# 结果:重命名目录
# 批量重命名
for file in *.jpeg; do
mv "$file" "${file%.jpeg}.jpg"
done
# 结果:所有 .jpeg 文件改为 .jpg
# 使用通配符移动
mv project/*.log /var/log/
# 结果:移动所有日志文件
三、文件查看与编辑
3.1 touch - 创建文件或更新时间戳
命令格式:
bash
touch [选项] 文件名...
参数详解:
-a:只更改访问时间-m:只更改修改时间-c:不创建新文件-d:使用指定字符串作为时间-t:使用[[CC]YY]MMDDhhmm[.ss]格式时间-r:使用指定文件的时间
使用示例:
bash
# 创建文件
touch newfile.txt # 创建空文件
touch file1.txt file2.txt # 创建多个文件
# 更新时间戳
touch -m existing.txt # 只更新修改时间为当前时间
touch -a important.txt # 只更新访问时间
# 不创建文件(仅更新时间戳)
touch -c nonexistent.txt # 文件不存在则不创建
# 设置特定时间
touch -t 202401151430.30 file.txt # 2024年1月15日14:30:30
touch -d "2 days ago" file.txt # 设置为2天前
touch -d "next friday" file.txt # 设置为下周五
# 使用参考文件的时间
touch -r source.txt target.txt
# 批量创建
touch file{1..10}.txt # 创建file1.txt到file10.txt
touch {jan,feb,mar}/{sales,expense}.csv # 创建复杂结构
3.2 cat - 由第一行开始显示文件内容
命令格式:
bash
cat [选项] [文件]...
参数详解:
-n:显示所有行号(包括空行)-b:显示非空行行号(忽略空行)-s:压缩连续空行为一行-E:每行末尾显示$-T: 制表符显示为^I-A:显示所有特殊字符(相当于-vET)-v:显示非打印字符(除了换行和制表符)
使用示例:
bash
# 查看单个文件
cat /etc/hosts
# 查看多个文件(依次显示)
cat file1.txt file2.txt file3.txt
# 使用通配符
cat *.log
cat file[1-3].txt
# 显示所有行号(包括空行)
cat -n server.log
# 输出示例:
# 1 [INFO] Server starting
# 2
# 3 [INFO] Loading config
# 4 [ERROR] File not found
# 只显示非空行行号
cat -b config.conf
# 输出示例:
# 1 # Server configuration
# 2 Port=8080
#
# 3 Host=localhost
# 显示所有特殊字符
cat -A test.txt
# 输出:
# Line1^ITab$
# Line2$
# ^IIndented$
# Line3 with special^A$
# 创建新文件(Ctrl+D 保存并退出)
cat > newfile.txt
Hello World!
This is line 2.
Ctrl+D
# 追加内容到文件
cat >> existing.txt
Additional content
Ctrl+D
# 从其他文件读取并追加
cat source.txt >> destination.txt
# 合并两个文件
cat header.txt body.txt footer.txt > complete.html
# 合并并排序
cat file1.txt file2.txt | sort > sorted.txt
# 合并多个日志文件
cat /var/log/app/*.log > all_logs.txt
# 合并时添加分隔符
cat file1.txt <(echo "---分隔符---") file2.txt > combined.txt
3.3 tac - 从最后一行开始显示文件内容
命令格式:
bash
tac [选项] [文件]...
参数详解:
-b:分隔符放在行前- `-r:将分隔符视为正则表达式
-s:指定分隔符(默认是换行符)
使用示例:
bash
# 创建测试文件
echo -e "第一行\n第二行\n第三行" > test.txt
# 正常查看
cat test.txt
# 输出:
# 第一行
# 第二行
# 第三行
# 反向查看
tac test.txt
# 输出:
# 第三行
# 第二行
# 第一行
# 创建两个文件
echo -e "A1\nA2\nA3" > file1.txt
echo -e "B1\nB2\nB3" > file2.txt
# 反向查看多个文件(每个文件独立反向)
tac file1.txt file2.txt
# 输出:
# A3 # file1.txt的最后一行
# A2
# A1 # file1.txt的第一行
# B3 # file2.txt的最后一行
# B2
# B1 # file2.txt的第一行
# 创建CSV格式数据
echo "John,30,Engineer" > data.csv
echo "Alice,25,Designer" >> data.csv
echo "Bob,35,Manager" >> data.csv
# 正常查看
cat data.csv
# 输出:
# John,30,Engineer
# Alice,25,Designer
# Bob,35,Manager
# 以逗号分隔反向显示
tac -s ',' data.csv
# 输出:
# Manager,35,Bob
# Designer,25,Alice
# Engineer,30,John
# 创建测试文本
echo "Hello World! Welcome to Linux." > text.txt
# 以空格为分隔符反向显示
tac -s ' ' text.txt
# 输出:
# Linux. to Welcome World! Hello
# 创建带编号的行
echo -e "1. Apple\n2. Banana\n3. Cherry" > fruits.txt
# 默认:分隔符在行后
tac fruits.txt
# 输出:
# 3. Cherry
# 2. Banana
# 1. Apple
# 以数字和点为分隔符,放在行前
tac -b -s '[0-9]\.' fruits.txt
# 输出:
# 3. Cherry
# 2. Banana
# 1. Apple
# 注意:这种情况下-b的效果不明显
3.4 more - 分页显示文件内容
命令格式:
bash
more [选项] 文件
参数详解:
-d:显示提示信息-c:清屏后显示-s:压缩连续空行
交互命令:
- 空格键:向下翻一页
- Enter:向下翻一行
- b:向上翻一页
- /pattern:搜索字符串
使用示例:
bash
more longfile.txt # 分页查看
ls -la | more # 管道中使用
more -d /etc/passwd # 带提示信息
3.5 less - 增强分页显示文件内容
命令格式:
bash
less [选项] 文件
参数详解:
-N:显示行号-S:不换行显示长行-i:忽略搜索大小写-R:正确处理颜色-F:文件小于一屏时自动退出
交互命令:
- 空格键:向下翻一页
- b:向上翻一页
- j:向下移动一行
- k:向上移动一行
- g:跳转到文件开头
- G:跳转到文件末尾
- /pattern:向前搜索
- ?pattern:向后搜索
- n:下一个匹配项
- N:上一个匹配项
- q:退出
使用示例:
bash
less logfile.txt # 查看日志
ls -la | less # 管道使用
less -N +100 file.txt # 从第100行开始
less -S /var/log/syslog # 不换行长行
3.6 head - 显示文件开头
命令格式:
bash
head [选项] 文件
参数详解:
-n NUM:显示前NUM行(默认10)-c NUM:显示前NUM字节-q:不显示文件名标题-v:显示文件名标题
使用示例:
bash
head file.txt # 前10行
head -n 20 file.txt # 前20行
head -c 100 file.txt # 前100字节
head -n -5 file.txt # 除了最后5行的所有行
head -q file1.txt file2.txt # 合并显示无标题
head -v *.txt # 显示每个文件名
3.7 tail - 显示文件末尾
命令格式:
bash
tail [选项] 文件
参数详解:
-n NUM:显示后NUM行(默认10)-c NUM:显示后NUM字节-f:跟踪文件变化(实时监控)-F:跟踪文件或文件名变化-q:不显示文件名标题-v:显示文件名标题--pid=PID:与-f一起用,PID结束时停止
使用示例:
bash
tail logfile.txt # 最后10行
tail -n 50 logfile.txt # 最后50行
tail -f /var/log/syslog # 实时跟踪日志
tail -F /var/log/*.log # 跟踪多个日志
tail -n +100 file.txt # 从第100行到末尾
tail -c 1k file.txt # 最后1KB
tail -f --pid=1234 log.txt # 跟踪到进程结束
四、文件查找
4.1 find - 查找文件
命令格式:
bash
find [路径...] [表达式]
参数详解:
-name:按文件名查找-type:按文件类型查找-mtime:按修改时间查找-size:按文件大小查找-user:按所有者查找-exec:对查找到的文件执行命令
使用示例:
bash
# 按文件名查找
find . -name "*.txt"
# 结果:查找当前目录下所有txt文件
# 按类型查找
find /var -type f # 查找普通文件
find /home -type d # 查找目录
find /dev -type l # 查找符号链接
# 按时间查找
find . -mtime 0 # 24小时内修改的文件
find . -mtime -7 # 7天内修改的文件
find . -mtime +30 # 30天前修改的文件
# 按大小查找
find . -size +10M # 大于10MB的文件
find . -size -1k # 小于1KB的文件
find . -size 0 # 空文件
# 按权限查找
find . -perm 644 # 权限为644的文件
find . -perm /u=x # 所有者可执行的文件
# 按所有者查找
find /home -user alice
find . -group developers
# 组合条件查找
find . -name "*.log" -size +1M
# 结果:大于1MB的日志文件
find . -type f -mtime -1 -name "*.tmp"
# 结果:24小时内修改的tmp文件
# 对查找到的文件执行命令
find . -name "*.tmp" -exec rm {} \;
# 结果:删除所有tmp文件
find . -name "*.sh" -exec chmod +x {} \;
# 结果:给所有sh文件添加执行权限
# 查找并统计
find . -type f -name "*.py" | wc -l
# 结果:统计Python文件数量
# 忽略大小写
find . -iname "readme*"
# 结果:查找 README, readme, ReadMe 等
# 限制查找深度
find . -maxdepth 2 -name "*.conf"
# 结果:最多查找2层目录
4.2 locate - 快速查找文件
命令格式:
bash
locate [选项] 模式
参数详解:
-i:忽略大小写-l NUM:限制结果数量-r:使用正则表达式-e:只显示存在的文件-q:安静模式(不显示错误)
使用示例:
bash
locate passwd # 查找passwd文件
locate -i "*.jpg" # 查找jpg文件(忽略大小写)
locate -l 10 "*.conf" # 只显示10个结果
locate -r "\.txt$" # 正则表达式查找
locate -e missing.txt # 只显示存在的文件
4.3 which - 查找命令位置
命令格式:
bash
which [选项] 命令
参数详解:
-a:显示所有匹配路径-i:忽略大小写
使用示例:
bash
which ls # 显示ls命令路径
which -a python # 显示所有python路径
which git gcc make # 查找多个命令
4.4 whereis - 查找命令相关文件
命令格式:
bash
whereis [选项] 命令
参数详解:
-b:只查找二进制文件-m:只查找手册页-s:只查找源代码-u:查找不常见条目
使用示例:
bash
whereis ls # 查找ls相关文件
whereis -b gcc # 只查找gcc二进制文件
whereis -m bash # 只查找bash手册页
五、文件比较
5.1 diff - 比较文件差异
命令格式:
bash
diff [选项] 文件1 文件2
参数详解:
-u:统一格式输出(推荐)-c:上下文格式输出-y:并排比较-i:忽略大小写-w:忽略空白差异-r:递归比较目录-q:只报告是否不同-s:报告相同文件
使用示例:
bash
diff file1.txt file2.txt # 基本比较
diff -u old.txt new.txt # 统一格式
diff -y config.old config.new # 并排比较
diff -r dir1 dir2 # 比较目录
diff -q file1 file2 # 只报告是否不同
diff -w script1.sh script2.sh # 忽略空白差异
5.2 cmp - 比较两个文件
命令格式:
bash
cmp [选项] 文件1 文件2
参数详解:
-l:显示所有不同字节-s:不显示输出,只返回退出码-i SKIP:跳过前SKIP字节-n LIMIT:最多比较LIMIT字节
使用示例:
bash
cmp file1.bin file2.bin # 比较二进制文件
cmp -l file1 file2 # 显示所有不同字节
cmp -s file1 file2 && echo "相同" # 静默比较
六、文件属性与权限
6.1 chmod - 修改文件权限
命令格式:
bash
chmod [选项] 模式 文件...
参数详解:
-R:递归修改-v:显示修改过程-c:只在有修改时显示
使用示例:
bash
# 模式表示法:
# 1. 符号模式: [ugoa][+-=][rwxXst]
# u=用户 g=组 o=其他 a=所有
# +添加 -移除 =设置
chmod u+x file # 用户添加执行权限
chmod g-w file # 组移除写权限
chmod o=r file # 其他设置只读
chmod a+x file # 所有人添加执行
# 2. 数字模式: 三位八进制数
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 600 file # rw-------
# 特殊权限:
chmod u+s file # SetUID
chmod g+s file # SetGID
chmod +t dir # Sticky Bit
6.2 chown - 修改文件所有者
命令格式:
bash
chown [选项] 用户[:组] 文件...
参数详解:
-R:递归修改-v:显示修改过程-c:只在有修改时显示
使用示例:
bash
chown user file.txt # 修改所有者
chown user:group file.txt # 同时修改所有者和组
chown :www-data /var/www # 只修改组
chown -R www-data:www-data /var/www # 递归修改
chown -v user file1 file2 # 显示修改过程
6.3 chgrp - 修改文件所属组
命令格式:
bash
chgrp [选项] 组 文件...
参数详解:
-R:递归修改-v:显示修改过程-c:只在有修改时显示
使用示例:
bash
chgrp staff file.txt # 修改组
chgrp -R www-data /var/www # 递归修改
chgrp -v admin file1 file2 # 显示修改过程
七、高级文件操作
7.1 ln - 创建链接
命令格式:
bash
ln [选项] 源文件 目标文件
参数详解:
-s:创建符号链接(软链接)-f:强制覆盖已存在的链接-i:覆盖前询问-v:显示创建过程-b:覆盖前备份-r:创建相对路径链接
使用示例:
bash
ln file.txt hardlink.txt # 创建硬链接
ln -s /var/www/html mysite # 创建符号链接
ln -sf /new/path existing_link # 强制更新链接
ln -sb target backup_link # 覆盖前备份
ln -sv /usr/bin/* ~/bin/ # 批量创建符号链接
7.2 readlink - 读取符号链接
命令格式:
bash
readlink [选项] 文件
参数详解:
-f:递归跟随直到非链接-e:类似-f,但要求路径存在-m:类似-f,但不要求路径存在-n:不输出换行符
使用示例:
bash
readlink /usr/bin/python # 读取链接目标
readlink -f /usr/bin/python3 # 解析所有链接
readlink -e broken_link # 检查链接有效性
7.3 realpath - 显示规范路径
命令格式:
bash
realpath [选项] 文件...
参数详解:
-s:不解析符号链接-e:路径必须存在-m:路径可以不存在-q:安静模式
使用示例:
bash
realpath . # 当前目录绝对路径
realpath -s symlink # 不解析符号链接
realpath -e /usr/bin/python # 检查存在性