文件管理命令详解

Linux文件属性与管理

文件或目录属性

文件或目录属性主要包括
索引节点,inode
文件类型
文件权限
硬链接个数
归属的用户和用户组
最新修改时间
###
举例
[yny@localhost ~]$ ls -lhi
85 -rw-rw-r--. 1 yny yny 1k Nov 29 04:45 10.txt
[85][Inode号码(Index node索引节点)身份证号码]
[-rw-rw-r--][文件的类型Linux权限]
[1][硬链接的数量,文件本身就是一个硬链接]
[yny yny][所有者:属于的组)]
[1k][文件的大小]
[Nov 29 04:45][文件的修改时间]
[10.txt][文件名]
###

扩展名

扩展名
Linux文件的扩展名只是方便阅读,对文件类型不影响
Linux通过文件属性区分文件类型
.txt文本类型
.conf .cfg .configure 配置文件
.sh .bash 脚本后缀
·py 脚本后缀
.rpm 红帽系统二进制软件包名
.tar .gz .zip 压缩后缀

文件类型

文件类型
可以通过 ls -F 给文件结尾加上特殊标识
格式 类型描述 
 ls -l 看第一个字符 - 
 -  普通文件regular file,(二进制,图片,日志,txt等) 
 d  文件夹directory 
 b  块设备文件,/dev/sda1,硬盘,光驱 
 c  设备文件,终端/dev/tty1,网络串口文件 
 s  套接字文件,进程间通信(socket)文件 
 p  管道文件pipe 
 l  链接文件,link类型,快捷方式 
#
普通文件
通过如下命令生成的都是普通文件(Windows中各种扩展名的文件,放入Linux也是普通文件类型):
-  echo 
-  touch 
-  cp 
-  cat 
- 重定向符号  > 
#
普通文件特征
文件类型以  -  开头,按内容分为两类:
- 纯文本:可用 cat 命令读取内容,包含字符、数字、特殊符号等。
- 二进制文件(binary):Linux中的命令属于这种格式,例如 ls 、 cat 等命令。
 #
文件夹
文件权限开头带有 d 字符的文件表示文件夹,是一种特殊的Linux文件。相关操作命令:
-  mkdir 
-  cp 拷贝文件夹
 #
链接类型
- 通过 ln 命令创建
- 类似Windows的快捷方式

find - 按条件搜索目录/文件

find 语法

语法:
find 处理符号链接 要查找的路径 参数限定条件 执行动作
find [-H,-L,-P] PATH options tests actions
符号链接详解:
1. -P - 不跟随符号链接(默认)
find -P /path
# 或
find /path
行为:
· 遇到符号链接时,只处理链接本身,不跟随
· 不会进入符号链接指向的目录进行递归搜索
· 最安全,避免循环链接问题
2. -L - 跟随符号链接
find -L /path
行为:
· 完全跟随符号链接,处理链接指向的实际文件/目录
· 会递归进入符号链接指向的目录
· 可能遇到循环链接导致无限递归
3. -H - 部分跟随符号链接
find -H /path
行为:
· 只在命令行参数指定的路径中跟随符号链接
· 在搜索过程中遇到的其他符号链接不跟随
· 折中方案
参数 解释 
pathname 要查找的路径 
options选项  
-maxdepth <目录层级>:设置最大目录层级; 
-mindepth <目录层级>:设置最小目录层级; 
tests模块  
-atime 按照文件访问access的时间查找,单位是天 
-ctime 按照文件的改变change状态来查找文件,单位是天 
-mtime 根据文件修改modify时间查找文件【最常用】 
-name 按照文件名字查找,支持*?[]通配符 
-group 按照文件的所属组查找 
-perm 按照文件的权限查找 
-size n[cwbkMG] 
  按照文件的大小为 n 个由后缀决定的数据块。 其中后缀为: 
    b: 代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b) 
    c: 表示字节数 
    k: 表示 kilo bytes(1024字节) 
    w: 字(2字节) M:兆字节(1048576字节) 
    G: 千兆字节(1073741824字节) 
-type 查找某一类型的文件 
  b - 块设备文件。 
  d - 目录。 
  c - 字符设备文件。
  p - 管道文件。 
  l - 符号链接文件。 
  f - 普通文件。 
  s - socket文件 按文件类型精准筛选
  例如  -type f  仅查找普通文件, -type d  仅查找目录 
-user 按照文件属主来查找文件。 定位特定用户所有的文件,例如  -user root  查找root拥有的文件 
-path 配合-prune参数排除指定目录 与 -prune 组合实现“排除某目录”的搜索,例如 -path /tmp -prune -o -name "*.log" (排除/tmp目录后查找log文件) 
Actions模块  对搜索结果执行操作的模块 
-prune 使find命令不在指定的目录寻找 用于排除不需要搜索的目录,避免无效遍历 
-delete 删除找出的文件 直接删除匹配的文件(需谨慎使用,建议先 -print 验证结果) 
-exec 或 -ok 对匹配的文件执行相应shell命令  -exec 直接执行命令; -ok 执行前需确认,更安全(例如 -exec rm {} \; 删除文件) 
-print 将匹配的结果标准输出 默认动作,输出文件路径,可结合管道进一步处理
OPERATORS  条件组合的运算符 
! 取反 例如  ! -name "*.txt"  查找非txt后缀的文件 
-a -o 取交集、并集,作用类似&&和\  -a (默认)表示“同时满足”, -o 表示“满足任一”,例如 -name "*.log" -a -mtime +7 (查找7天前的log文件) 

举例

举例:
 find /var -name "*.log" #查看/tmp目录下以.log结尾的文件
 find ./dir1 -maxdepth 3  -name "*.txt" #查看当前dir1目录下以.txt结尾的文件,最大搜索深度为3
 find ./dir1 -name [1-9]* #查看当前dir1目录下以数字1-9开头的文件和目录
 find ./dir1 -type d -name [1-9]* #查看当前dir1目录下以数字1-9开头的目录
 find ./dir1 -type f -name [1-9]* #查看当前dir1目录下以数字1-9开头的普通文件
 find ./dir1 -name [1-9]* -delete #删除当前dir1目录下以数字1-9开头的文件和目录
 find ./dir1 -atime n
  -atime -2 搜索在2天内被访问过的文件
  -atime 2 搜索恰好在2天前被访问过的文件
  -atime +2 搜索超过2天内被访问的文件
 find ./dir1 ! -name [1-9]*.txt  #查看当前dir1目录下除了以1-9开头同时以.txt结尾的文件
 find / -type f -size +100M #查看当前系统大于100M的文件
 find ./dir1 -path "./dir1/dir2" -prune -o -name [1-9]* | cat -n 
    在 ./dir1 目录下查找文件/目录;
    排除 ./dir1/dir2 路径( -prune 参数实现排除);
    仅匹配名称以数字1-9开头的项;
 find ./dir1 -name [1-9]* -ok  rm  {} \; #删除当前dir1目录下以数字1-9开头的文件和目录(需要确认)
 find ./dir1 -name [1-9]* -exec  rm  {} \; #删除当前dir1目录下以数字1-9开头的文件和目录(无需要确认)
 find ./dir1 -name [1-9]* -exec  rm  {} +; #删除当前dir1目录下以数字1-9开头的文件和目录(无需要确认,且批量执行,更高效

file - 确定文件的类型

file语法

1. 什么是 file 命令?
在 Linux 和 Unix-like 系统中,文件扩展名(如 .txt, .jpg, .exe)并不直接决定文件的类型,它们更多是给用户看的约定。file 命令通过分析文件的内容(魔术数字、字符编码、结构等)而不是其名称,来推断文件的真实类型。
它的工作原理是查询一个名为 magic 的数据库文件(通常是 /usr/share/misc/magic 或 /etc/magic),该数据库中定义了各种文件类型的特征签名。
2. 命令语法
```bash
file [选项]... 文件名...
3. 常用选项
选项 描述
选项-b 简洁模式。输出中不显示文件名,只显示文件类型。
选项-i 输出 MIME 类型。而不是人类可读的文字描述。
选项-I 输出 MIME 类型。比 -i 更精确,且不反解符号链接。
选项-L 直接查看符号链接指向的文件本身。默认情况下,file 会显示符号链接自身的类型。
选项-s 读取设备文件或特殊文件。默认情况下,file 不会尝试读取这些文件。
选项-v 显示版本信息。
选项-z 尝试查看压缩文件内部。
选项-k 不停止在第一个匹配类型。继续匹配所有可能的类型。
选项-F 分隔符 使用指定分隔符 代替默认的 :。
选项-f 文件列表 从指定文件中读取需要检测的文件名列表。
选项--mime-type 只输出 MIME 类型(类似于 -I)。
选项--mime-encoding 输出文件的 MIME 编码

举例

1. 使用方法与实例
假设我们有以下文件:
· document.pdf
· script.sh
· image.jpg
· a_symlink -> document.pdf (一个指向 document.pdf 的软链接)
· /dev/sda (一个设备文件)
基本用法
```bash
file document.pdf
# 输出: document.pdf: PDF document, version 1.5
file script.sh
# 输出: script.sh: Bourne-Again shell script, ASCII text executable
file image.jpg
# 输出: image.jpg: JPEG image data, JFIF standard 1.01
一次检查多个文件
```bash
file document.pdf script.sh image.jpg
# 输出:
# document.pdf: PDF document, version 1.5
# script.sh:    Bourne-Again shell script, ASCII text executable
# image.jpg:    JPEG image data, JFIF standard 1.01
使用简洁模式 (-b)
在脚本中处理时,去掉文件名非常有用。
```bash
file -b document.pdf
# 输出: PDF document, version 1.5
输出 MIME 类型 (-i 和 -I)
这在 Web 开发或需要程序化处理时特别有用。
```bash
file -i document.pdf
# 输出: document.pdf: application/pdf; charset=binary
file -I document.pdf
# 输出: document.pdf: application/pdf
file -i script.sh
# 输出: script.sh: text/x-shellscript; charset=us-ascii
file -i image.jpg
# 输出: image.jpg: image/jpeg; charset=binary
处理符号链接 (-L)
```bash
# 默认情况:检查符号链接本身
file a_symlink
# 输出: a_symlink: symbolic link to document.pdf
# 使用 -L 选项:检查符号链接指向的实际文件
file -L a_symlink
# 输出: a_symlink: PDF document, version 1.5
检查特殊文件或设备文件 (-s)
```bash
# 默认情况:不读取设备文件
file /dev/sda
# 输出: /dev/sda: block special (8/0)
# 使用 -s 选项:尝试读取设备文件的签名
file -s /dev/sda
# 输出: /dev/sda: DOS/MBR boot sector
注意:对设备文件使用 -s 需要 root 权限。
查看压缩文件内部 (-z)
```bash
# 有一个名为 archive.tar.gz 的压缩包
file archive.tar.gz
# 输出: archive.tar.gz: gzip compressed data, was "archive.tar", last modified: ...
# 使用 -z 选项,尝试识别压缩包内文件的类型
file -z archive.tar.gz
# 输出: archive.tar.gz: GNU tar archive (gzip compressed data, was "archive.tar", last modified: ...)
# 注意:它识别出外层是 gzip,内层是 tar。
# 对于一个 .gz 的纯文本文件
file compressed_text.txt.gz
# 输出: compressed_text.txt.gz: gzip compressed data, was "compressed_text.txt", last modified ...
file -z compressed_text.txt.gz
# 输出: compressed_text.txt.gz: ASCII text (gzip compressed data, was "compressed_text.txt", last modified ...)
从文件列表读取 (-f)
当你有一个包含很多文件路径的文本文件时,这个功能非常高效。
```bash
# 首先,创建一个文件列表
echo -e "/etc/passwd\n/var/log/syslog\n/bin/ls" > file_list.txt
# 然后让 file 命令从这个列表中读取
file -f file_list.txt
# 输出:
# /etc/passwd:    ASCII text
# /var/log/syslog: ASCII text
# /bin/ls:        ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, ...
输出 MIME 编码 (--mime-encoding)
这个选项用于判断文件的字符编码。
```bash
file --mime-encoding script.sh
# 输出: script.sh: us-ascii
file --mime-encoding document.pdf
# 输出: document.pdf: binary
# 创建一个 UTF-8 编码的文本文件
echo "你好,世界" > chinese.txt
file --mime-encoding chinese.txt
# 输出: chinese.txt: utf-8

工作原理简介

5. 工作原理简介
file 命令主要通过三个步骤来判断文件类型:
1. 文件系统测试:检查文件的 inode 信息,判断它是普通文件、目录、符号链接、块设备、字符设备、套接字还是 FIFO。
2. 魔术数字测试:这是最核心的一步。读取文件开头的特定字节(魔术数字),与 /usr/share/misc/magic 数据库中的模式进行匹配。例如:
   · PNG 图片总是以字节 89 50 4E 47 0D 0A 1A 0A 开头。
   · PDF 文件总是以字符串 %PDF- 开头。
   · ZIP 文件(包括 .jar, .docx 等)以 PK 开头。
3. 语言测试:如果上述测试失败,它会尝试判断文件是否是文本文件,并推测其编码(如 ASCII、UTF-8)和可能的编程语言(如 Bash 脚本、Python 脚本)。

ls - 列出目录内容

基本语法

```bash
ls [选项] [文件/目录]
常用选项详解
1. 显示格式选项
ls -l      # 长格式显示,显示详细信息
ls -1      # 每行显示一个文件
ls -m      # 逗号分隔显示
ls -C      # 多列显示(默认)
ls -x      # 按行多列显示
2. 显示内容选项
ls -a      # 显示所有文件,包括隐藏文件(以.开头)
ls -A      # 显示几乎所有文件,不包括 . 和 ..
ls -d      # 只显示目录本身,不显示内容
ls -F      # 显示文件类型标识符
           # / 表示目录,* 表示可执行文件,@ 表示符号链接
ls --color # 彩色显示(通常为默认)
3. 排序选项
ls -t      # 按修改时间排序,最新的在前
ls -r      # 反向排序
ls -S      # 按文件大小排序
ls -X      # 按扩展名排序
ls -v      # 自然排序(版本号)
4. 详细信息选项
ls -h      # 人类可读的文件大小(KB, MB, GB)
ls -i      # 显示inode号码
ls -n      # 显示UID和GID而不是用户名
ls -o      # 类似 -l 但不显示组信息

常用组合

ls -la     # 显示所有文件的详细信息
ls -lht    # 按时间排序,显示详细信息和人可读大小
ls -lSr    # 按文件大小反向排序(从小到大)
ls -l *.txt # 只显示txt文件
详细输出解读
使用 ls -l 时,输出格式为:
-rwxr-xr-x 1 user group 1024 Jan 01 10:00 filename
各部分含义:
· 文件权限:-rwxr-xr-x
  · 第一个字符:文件类型(- 普通文件,d 目录,l 链接等)
  · 后面9个字符:三组权限(所有者、组、其他用户)
· 链接数:硬链接数量
· 所有者:文件所有者
· 所属组:文件所属用户组
· 文件大小:字节为单位
· 修改时间:最后修改时间
· 文件名:文件或目录名

高级用法

递归列出
ls -R      # 递归列出子目录内容
ls -lR     # 递归详细列出
按时间筛选
ls -lt     # 按修改时间排序
ls -lut    # 按访问时间排序
ls -lct    # 按状态改变时间排序
自定义格式
ls -l --time-style=full-iso    # 完整ISO时间格式
ls -l --time-style=long-iso    # 长ISO格式
ls -l --time-style=locale      # 本地化格式
实用技巧
1. 显示目录大小
ls -lh | grep '^d'    # 只显示目录
2. 查找最新文件
ls -t | head -1       # 显示最新文件
3. 按文件类型显示
ls -p | grep '/$'     # 只显示目录
ls -p | grep -v '/$'  # 只显示文件
4. 彩色输出控制
ls --color=auto       # 自动彩色显示(默认)
ls --color=always     # 总是彩色显示
ls --color=never      # 从不彩色显示
注意事项
· 不同Linux发行版的 ls 命令可能有细微差别
· 颜色显示取决于终端支持和配置
· 文件大小显示可能因块大小设置而不同

cd - 切换目录

基本语法

基本语法
cd [目录路径]
1. 基本目录切换
cd /path/to/directory    # 切换到绝对路径
cd relative/path         # 切换到相对路径
cd                      # 不加参数,切换到用户主目录
cd ~                    # 切换到用户主目录
cd ~username            # 切换到指定用户的主目录
2. 特殊目录符号
cd .                    # 切换到当前目录(无变化)
cd ..                   # 切换到上级目录
cd ../..                # 切换到上两级目录
cd -                    # 切换到上一个工作目录
3. 环境变量相关
cd $HOME                # 使用HOME环境变量切换到主目录
cd ~                    # 等同于 cd $HOME
cd /var/$USER           # 使用USER环境变量

实用技巧和示例

快速目录导航
cd /etc/nginx/conf.d    # 切换到绝对路径
cd ../../usr/local/bin  # 使用相对路径向上移动
cd -                    # 在两个目录间快速切换
结合其他命令使用
cd /var/log && ls -l    # 切换目录并列出内容
cd .. && pwd            # 返回上级并显示当前路径
使用通配符
cd /usr/local/*         # 切换到第一个匹配的目录
cd /home/*/Documents    # 使用通配符匹配用户

pwd - 打印当前工作目录

print work directory 打印工作目录的意思
会输出当前所处的一个绝对路径

mkdir - 创建目录

基本语法

mkdir [选项] 目录名...
常用选项详解
1. 基础选项
mkdir dirname          # 创建单个目录
mkdir dir1 dir2 dir3   # 同时创建多个目录
2. 递归创建选项
mkdir -p parent/child/grandchild    # 递归创建多级目录
mkdir -p /path/to/nested/directories
3. 权限相关选项
mkdir -m 755 dirname   # 创建目录时指定权限
mkdir -m u=rwx,g=rx,o=rx dirname
4. 详细输出选项
mkdir -v dirname       # 显示创建过程信息

权限模式详解

常用权限设置
mkdir -m 755 dirname   # rwxr-xr-x (所有者可读写执行,其他用户只读执行)
mkdir -m 700 dirname   # rwx------ (仅所有者可访问)
mkdir -m 777 dirname   # rwxrwxrwx (所有用户都有完全权限)
mkdir -m 644 dirname   # 注意:644对目录来说通常不合适
符号权限表示法
mkdir -m u=rwx,g=rx,o= dirname     # 所有者rwx,组rx,其他用户无权限
mkdir -m a=rx dirname              # 所有用户都可读和执行

实用示例

基本目录创建
mkdir projects                    # 创建单个目录
mkdir doc1 doc2 doc3             # 创建多个目录
mkdir "dir with spaces"          # 创建包含空格的目
递归创建目录结构
mkdir -p project/{src,bin,doc}   # 创建项目目录结构
mkdir -p ~/backup/$(date +%Y-%m-%d)  # 创建带日期的备份目录
mkdir -p /opt/myapp/{logs,config,cache}  # 创建应用目录结构
带权限的目录创建
mkdir -m 750 secure_dir          # 创建安全目录
mkdir -p -m 755 web/{public,private}/assets  # 递归创建并设置权限
高级用法
1. 使用大括号扩展
mkdir -p images/{jpg,png,gif}    # 创建 jpg, png, gif 三个目录
mkdir -p project{1..5}/src      # 创建 project1到project5 的src目录
mkdir -p {a,b,c}/{1,2,3}        # 创建复杂的目录结构

touch - 创建空文件/更新时间戳

touch 命令详解

touch 命令是 Linux/Unix 系统中用于创建空文件和修改文件时间戳的工具。
基本语法
touch [选项] 文件名...
命令选项详解
1. 常用选项
-a 只更改访问时间 (access time)
-c 不创建新文件,只更新时间戳
-m 只更改修改时间 (modify time)
-r <文件> 使用指定文件的时间戳
-t <时间> 使用指定的时间戳
-d <字符串> 使用指定的时间字符串
-h 影响符号链接本身而非指向的文件
2. 时间格式说明
-t 选项时间格式: [[CC]YY]MMDDhhmm[.ss]
touch -t 202412151430.30 file.txt    # 2024年12月15日14:30:30
touch -t 2412151430 file.txt         # 2024年12月15日14:30:00
时间格式说明:
· CC:世纪(可选)
· YY:年份后两位
· MM:月份(01-12)
· DD:日期(01-31)
· hh:小时(00-23)
· mm:分钟(00-59)
· ss:秒(00-59,可选)
-d 选项时间字符串:
touch -d "2024-01-01 00:00:00" file.txt
touch -d "next Friday" file.txt
touch -d "2 days ago" file.txt
touch -d "yesterday" file.txt

实用示例

1. 基础文件操作
# 创建单个文件
touch file.txt
# 创建多个文件
touch file1.txt file2.txt file3.txt
# 创建带空格的文件
touch "my document.txt"
touch my\ document.txt
2. 批量创建文件
# 使用大括号扩展
touch file{1..5}.txt              # 创建 file1.txt 到 file5.txt
touch image_{a..e}.jpg            # 创建 image_a.jpg 到 image_e.jpg
touch chapter_{01..10}.md         # 创建 chapter_01.md 到 chapter_10.md
# 结合其他模式
# 结合其他模式
touch {red,blue,green}_file.txt   # 创建 red_file.txt, blue_file.txt, green_file.txt
3. 时间戳操作
# 更新时间戳为当前时间
touch existing_file.txt
# 只更新访问时间
touch -a logfile.log
# 只更新修改时间
touch -m document.doc
# 不创建新文件,只更新时间戳
touch -c maybe_existing_file.txt
4. 设置特定时间
# 设置具体时间
touch -t 202412251200.00 christmas_file.txt
touch -t 202501010000.00 newyear_file.txt
# 使用时间字符串
touch -d "2024-03-15 09:30:00" meeting_notes.txt
touch -d "1 hour ago" recent_file.txt
touch -d "tomorrow" future_file.txt
5. 使用参考文件时间
# 使目标文件时间戳与参考文件相同
touch -r source.txt target.txt
touch -r template.conf new_config.conf

高级用法

1. 在脚本中的应用
bash
#!/bin/bash
# 创建带时间戳的日志文件
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
touch "log_${TIMESTAMP}.txt"
# 创建标志文件
touch /var/run/application.ready
# 检查并创建配置文件
if [ ! -f "config.conf" ]; then
    touch config.conf
    echo "配置文件已创建"
fi
2. 结合 find 命令使用
# 更新所有 .txt 文件的时间戳
find . -name "*.txt" -exec touch {} \;
# 更新7天内修改过的文件
find . -mtime -7 -exec touch {} \;
# 只更新时间戳,不创建新文件
find . -name "*.log" -exec touch -c {} \;
# 更新目录下所有文件(包括子目录)
find /path/to/dir -type f -exec touch {} \;
3. 符号链接处理
# 创建符号链接
ln -s target.txt link.txt
# 默认:更新符号链接指向的文件时间
touch link.txt
# 更新符号链接本身的时间
touch -h link.txt

cp - 复制文件/目录

基本语法

基本语法
cp [选项] 源文件 目标文件
cp [选项] 源文件... 目标目录
常用选项详解
1. 基础选项
选项 说明
选项-i 交互模式,覆盖前提示确认
选项-f 强制覆盖,不提示
选项-n 不覆盖已存在文件
选项-v 显示详细操作信息
选项-u 只复制源比目标新的文件
2. 递归和链接选项
选项 说明
选项-r / -R 递归复制目录
选项-l 创建硬链接而非复制
选项-s 创建符号链接(软链接)
选项-L 跟随符号链接
选项-P 不跟随符号链接
3. 属性保留选项
选项 说明
选项-p 保留原文件属性(权限、时间戳等)
选项-a 归档模式,相当于 -dR --preserve=all
选项--preserve=[属性列表] 保留指定属性

实用示例

1. 基础文件复制
# 复制单个文件
cp file1.txt file2.txt
# 复制到指定目录
cp file1.txt /backup/
cp file1.txt /backup/file1_backup.txt
# 复制多个文件到目录
cp file1.txt file2.txt file3.txt /destination/
2. 目录复制
# 递归复制目录
cp -r dir1/ dir2/
cp -R /home/user/documents /backup/
# 复制目录内容(不包含目录本身)
cp -r source_dir/* dest_dir/
3. 交互和安全复制
# 覆盖前确认
cp -i important.txt backup/
# 提示:cp: overwrite 'backup/important.txt'?
# 强制覆盖
cp -f config.conf /etc/
# 不覆盖已存在文件
cp -n new_file.txt existing_dir/
4. 保留文件属性
# 保留所有属性(权限、时间戳等)
cp -p source.txt dest.txt
# 归档模式(常用于备份)
cp -a /home/user /backup/
# 保留特定属性
cp --preserve=mode,ownership source.txt dest.txt
5. 链接相关操作
# 创建硬链接
cp -l original.txt link.txt
# 创建符号链接
cp -s /path/to/source link_name
# 复制链接指向的实际文件
cp -L symbolic_link actual_copy.txt

高级用法

1. 批量复制和模式匹配
# 使用通配符
cp *.txt text_files/
cp image*.jpg photos/
# 使用大括号扩展
cp file{1..5}.txt backup/
cp {report,data}.{txt,csv} archive/
# 复制特定类型文件
cp **/*.conf config_backup/
2. 结合 find 命令
# 复制所有 .txt 文件
find . -name "*.txt" -exec cp {} /backup/ \;
# 复制7天内修改的文件
find /source -mtime -7 -exec cp {} /backup/ \;
# 使用 xargs 提高效率
find . -name "*.log" -print0 | xargs -0 cp -t /backup/
3. 进度显示和验证
# 显示复制进度(需要 rsync)
rsync -av --progress source/ destination/
# 验证复制结果
cp -v file1.txt file2.txt
md5sum file1.txt file2.txt  # 比较校验和
4. 特殊场景复制
 只复制更新过的文件
cp -u source.txt destination/
# 创建备份文件(避免覆盖)
cp --backup=numbered config.conf config.conf
# 复制稀疏文件
cp --sparse=always large_file.img backup/
权限和所有权处理
权限保留
# 保留原始权限
cp -p source.sh dest.sh
# 归档模式保留所有属性
cp -a /etc/nginx/ nginx_backup/
# 手动设置权限
cp source.txt dest.txt && chmod 644 dest.txt
# 普通用户无法保留所有权
# 使用 sudo 保留所有权
sudo cp -p system_file /etc/
# 复制后修复所有权
cp config.conf /webroot/ && chown www-data:www-data /webroot/config.conf

mv - 移动/重命名

基本语法

mv 命令用于在 Linux/Unix 系统中移动或重命名文件和目录。下面是详细解析:
基本语法
mv [选项] 源文件 目标文件
mv [选项] 源文件... 目标目录
常用选项详解
1. 基础选项
选项 说明
选项-i 交互模式,覆盖前提示确认
选项-f 强制覆盖,不提示
选项-n 不覆盖已存在文件
选项-v 显示详细操作信息
选项-u 只移动源比目标新的文件
2. 备份和安全选项
选项 说明
选项-b 覆盖前创建备份
选项-S 指定备份文件后缀
选项--backup=[控制方式] 备份控制(numbered, simple, existing)
选项-T 将目标视为普通文件而非目录

实用示例

1. 重命名文件
# 重命名单个文件
mv oldname.txt newname.txt
# 重命名并更改扩展名
mv document.doc document.pdf
mv image.jpg image.png
# 添加前缀/后缀
mv file.txt backup_file.txt
mv data.csv data_2024.csv
2. 移动文件到目录
# 移动单个文件到目录
mv file.txt /target/directory/
# 移动多个文件到目录
mv file1.txt file2.txt file3.txt /destination/
# 使用通配符移动
mv *.jpg /photos/
mv data_*.csv /archive/
3. 移动和重命名目录
# 重命名目录
mv old_dir/ new_dir/
# 移动目录到新位置
mv my_project/ /workspace/
# 移动目录并重命名
mv source_dir/ /path/to/destination_dir/
4. 交互和安全操作
# 覆盖前确认(推荐使用)
mv -i important.txt backup/
# 提示:mv: overwrite 'backup/important.txt'?
# 强制覆盖
mv -f temp_file /tmp/
# 不覆盖已存在文件
mv -n new_file.txt existing_dir/
5. 备份功能
# 覆盖前创建备份(默认使用 ~ 后缀)
mv -b config.conf config_new.conf
ls -la  # 可以看到 config.conf~
# 指定备份后缀
mv -b -S .backup file.txt file_new.txt
ls -la  # 可以看到 file.txt.backup
# 使用编号备份
mv --backup=numbered data.txt data_new.txt
# 生成 data.txt.~1~, data.txt.~2~ 等

高级用法

1. 批量重命名和移动
# 使用大括号扩展
mv file{,_backup}.txt          # file.txt → file_backup.txt
mv image.{jpg,png}             # image.jpg → image.png
# 批量添加前缀
for file in *.txt; do
    mv "$file" "archive_$file"
done
# 批量更改扩展名
for file in *.jpeg; do
    mv "$file" "${file%.jpeg}.jpg"
done
2. 结合 find 命令
# 移动所有 .log 文件
find . -name "*.log" -exec mv {} /var/log/ \;
# 移动7天前的文件
find /tmp -mtime +7 -exec mv {} /old_tmp/ \;
# 使用 xargs 提高效率
find . -name "*.tmp" -print0 | xargs -0 mv -t /tmp/
3. 模式匹配和通配符
# 移动匹配模式的文件
mv prefix_* /target_dir/
mv *.{jpg,png,gif} /images/
# 移动排除某些文件
mv !(exclude.txt) /destination/  # 需要 extglob
4. 条件移动
# 只移动较新的文件
mv -u updated_config.conf /etc/
# 移动空文件
find . -type f -empty -exec mv {} /empty_files/ \;
# 移动特定大小的文件
find . -size +10M -exec mv {} /large_files/ \;

特殊场景处理

1. 跨文件系统移动
# 跨文件系统移动实际上是复制+删除
mv /home/user/file.txt /mnt/backup/  # 自动处理
# 大文件跨文件系统移动可能较慢
mv large_file.iso /external_drive/
2. 符号链接处理
# 移动符号链接本身(默认行为)
mv symlink /new/location/  # 链接仍然有效
# 如果目标存在符号链接
mv file.txt symlink_to_file  # 会覆盖链接指向的文件
3. 权限和所有权
# 移动文件保持权限(在同一个文件系统内)
mv protected_file.txt /secure/  # 权限保持不变
# 跨文件系统时权限可能变化
mv file.txt /mnt/other_fs/     # 权限可能重置

rm - 删除命令

基本语法

rm [选项] 文件...
rm [选项] 目录...
1. 基础选项
选项 说明
选项-i 交互模式,删除前提示确认
选项-f 强制删除,不提示,忽略不存在的文件
选项-v 显示详细操作信息
选项-I 在删除超过3个文件或递归删除前提示一次
2. 目录删除选项
选项 说明
选项-r / -R 递归删除目录及其内容
选项-d 删除空目录
致命命令示例
# 绝对不要执行这些命令!
rm -rf /         # 删除整个系统!
rm -rf /*        # 删除根目录下所有文件!
rm -rf .         # 删除当前目录所有文件!
rm -rf ~         # 删除家目录所有文件!

实用示例

实用示例
1. 安全删除文件
# 交互式删除(推荐日常使用)
rm -i important.txt
# 提示:rm: remove regular file 'important.txt'?
# 删除单个文件
rm file.txt
# 删除多个文件
rm file1.txt file2.txt file3.txt
# 使用通配符(小心!)
rm *.tmp
rm data_*.log
2. 目录删除
# 删除空目录
rm -d empty_dir/
rmdir empty_dir/    # 等效命令
# 递归删除目录及其所有内容
rm -r directory/
rm -rf node_modules/  # 常用:强制删除node_modules
# 交互式递归删除
rm -ri old_project/
3. 详细和强制操作
# 显示删除过程
rm -v temporary_files/*
# 强制删除,不提示
rm -f locked_file.txt
# 强制递归删除
rm -rf /tmp/cache/  # 常用于清理临时文件

安全使用实践

1. 设置安全别名(推荐)
在 ~/.bashrc 或 ~/.bash_profile 中添加:
# 让 rm 总是交互式操作
alias rm='rm -i'
# 或者使用 trash-cli(如果安装)
alias rm='trash-put'
2. 使用安全删除工具
# 安装 trash-cli(类似回收站)
sudo apt install trash-cli    # Ubuntu/Debian
sudo yum install trash-cli    # CentOS/RHEL
# 使用 trash-cli
trash-put file.txt           # 移动到"回收站"
trash-list                   # 列出已删除文件
trash-restore                # 恢复文件
trash-empty                  # 清空回收站

高级用法

1. 结合 find 命令安全删除
# 删除7天前的 .log 文件
find . -name "*.log" -mtime +7 -exec rm {} \;
# 删除空文件
find . -type f -empty -exec rm -i {} \;
# 删除特定大小的文件
find . -size +100M -exec rm -i {} \;
# 使用 xargs 提高效率
find . -name "*.tmp" -print0 | xargs -0 rm
2. 条件删除
# 删除但排除某些文件
rm !(important.txt)          # 需要 extglob
shopt -s extglob            # 启用扩展通配符
rm !(important.txt|keep_dir)
# 删除特定类型的文件
find . -name "*.jpg" -o -name "*.png" | xargs rm

Linux帮助命令

man - 手册页命令

基本用法
man ls          # 查看 ls 命令的手册
man man         # 查看 man 命令本身的手册
手册章节
man 1 ls        # 查看第1章节(用户命令)
man 5 passwd    # 查看第5章节(文件格式)
man 8 useradd   # 查看第8章节(系统管理命令)
手册章节说明:
1:用户命令
2:系统调用
3:库函数
4:设备文件
5:文件格式
6:游戏
7:杂项
8:系统管理命令
man 页面导航
空格键          # 向下翻页
Enter          # 向下滚动一行
b              # 向上翻页
/pattern       # 搜索关键词
n              # 下一个匹配项
N              # 上一个匹配项
q              # 退出

help 或 -h 选项

基本用法
ls --help       # 显示命令帮助信息
cp --help
mkdir --help
# 短格式(有些命令支持)
ls -h
git -h
特点
简洁明了
快速查看常用选项
不需要加载完整手册页

info - 信息文档

基本用法
info ls         # 查看 ls 的 info 文档
info coreutils  # 查看核心工具文档
info 页面导航
n              # 下一个节点
p              # 上一个节点
u              # 向上级节点
Enter          # 进入链接
q              # 退出

whatis - 命令简要描述

基本用法
whatis ls       # 显示命令的简要描述
whatis cp
whatis mkdir
更新数据库
sudo mandb      # 更新 whatis 数据库(Ubuntu/Debian)
sudo makewhatis # 更新 whatis 数据库(CentOS/RHEL)

apropos - 搜索相关命令

基本用法
apropos copy    # 搜索与 copy 相关的命令
apropos network
apropos "user management"
示例输出
$ apropos copy
cp (1)              - copy files and directories
cpio (1)            - copy files to and from archives
dd (1)              - convert and copy a file

which - 显示命令路径

基本用法
which ls        # 显示 ls 命令的完整路径
which python
which git
示例输出
$ which ls
/usr/bin/ls

whereis - 定位命令文件

基本用法
whereis ls      # 显示命令的二进制文件、源码和手册页位置
whereis python
示例输出
$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

type - 显示命令类型

基本用法
type ls         # 显示命令类型(内置、别名、外部命令)
type cd
type ll
示例输出
$ type ls
ls is aliased to `ls --color=auto`
$ type cd
cd is a shell builtin
$ type python
python is /usr/bin/python

help - Shell 内置命令帮助

基本用法
help cd         # 查看 shell 内置命令帮助
help type
help echo
查看所有内置命令
help            # 显示所有 shell 内置命令
compgen -b      # 显示所有内置命令

Linux开关机命令

重启
语法:shutdown -r 参数
-r --rebootReboot the machine
shutdown -r 10 #十分钟后重启
shutdown -r 0 #立刻重启
shutdown-r now #立刻重启
关机
语法:
shutdown -h --halt停止的含义
shutdown -h 10 #十分钟后关机
shutdown -h 0 #立即关机
shutdown -h now #立即关机
其他
reboot 重启
poweroff 关机
halt 关机

Linux命令行常用快捷键

ctrl + c 取消当前操作
ctrl + l 清空屏幕内容
ctrl + d 退出当前用户
ctrl + a 光标移到行首
ctrl + e 光标移到行尾
ctrl + u 删除光标到行首的内容

Vim 命令详解

Vim 的三种基本模式

## Vim 的三种基本模式
### 1. 正常模式 (Normal Mode)
- 进入方式:按 `Esc` 键
- 用于导航、复制、粘贴、删除等操作
### 2. 插入模式 (Insert Mode)
- 进入方式:按 `i`, `a`, `o` 等键
- 用于输入文本
### 3. 可视模式 (Visual Mode)
- 进入方式:按 `v`, `V`, `Ctrl+v`
- 用于选择文本

启动和退出 Vim

## 启动和退出 Vim
### 启动 Vim
vim filename          # 编辑指定文件
vim +10 filename      # 打开文件并定位到第10行
vim +/pattern filename # 打开文件并搜索模式
vim -o file1 file2    # 水平分割窗口打开多个文件
vim -O file1 file2    # 垂直分割窗口打开多个文件
### 退出 Vim
:q              # 退出(如果没有修改)
:q!             # 强制退出,不保存修改
:wq             # 保存并退出
:x              # 保存并退出
ZZ              # 保存并退出(正常模式下)
ZQ              # 不保存退出(正常模式下)

光标移动

## 光标移动
h          # 左
j          # 下
k          # 上
l          # 右
w          # 移动到下一个单词开头
W          # 移动到下一个单词开头(忽略标点)
b          # 移动到上一个单词开头
e          # 移动到单词结尾
0          # 移动到行首
^          # 移动到行首第一个非空字符
$          # 移动到行尾

页面导航

### 页面导航
Ctrl+f     # 向下翻页
Ctrl+b     # 向上翻页
Ctrl+d     # 向下翻半页
Ctrl+u     # 向上翻半页
gg         # 移动到文件开头
G          # 移动到文件末尾
50G        # 移动到第50行
:50        # 移动到第50行

屏幕内移动

### 屏幕内移动
H          # 移动到屏幕顶部
M          # 移动到屏幕中间
L          # 移动到屏幕底部

zt         # 当前行移动到屏幕顶部
zz         # 当前行移动到屏幕中间
zb         # 当前行移动到屏幕底部

插入文本

## 插入文本
### 进入插入模式
i          # 在光标前插入
I          # 在行首插入
a          # 在光标后插入
A          # 在行尾插入
o          # 在下一行插入
O          # 在上一行插入

s          # 删除当前字符并插入
S          # 删除当前行并插入
c{motion}  # 删除指定范围并插入
C          # 删除到行尾并插入

删除操作

## 删除操作
### 删除字符和行
x          # 删除当前字符
X          # 删除前一个字符
dd         # 删除当前行
D          # 删除到行尾

dw         # 删除一个单词
d$         # 删除到行尾
d0         # 删除到行首

5dd        # 删除5行
d5w        # 删除5个单词

复制和粘贴

## 复制和粘贴
### 复制 (yank)
yy         # 复制当前行
Y          # 复制当前行
yw         # 复制一个单词
y$         # 复制到行尾
yG         # 复制到文件末尾

"ayy       # 复制到寄存器 a
"byw       # 复制单词到寄存器 b
### 粘贴 (put)
p          # 在光标后粘贴
P          # 在光标前粘贴

"ap        # 从寄存器 a 粘贴
"bp        # 从寄存器 b 粘贴

撤销和重做

## 撤销和重做
u          # 撤销
Ctrl+r     # 重做
U          # 撤销整行修改

搜索和替换

### 搜索
/pattern   # 向前搜索模式
?pattern   # 向后搜索模式
n          # 下一个匹配项
N          # 上一个匹配项
*          # 搜索当前单词(向前)
#          # 搜索当前单词(向后)
### 替换
:s/old/new/           # 替换当前行的第一个 old
:s/old/new/g          # 替换当前行的所有 old
:%s/old/new/g         # 替换全文的 old
:1,10s/old/new/g      # 替换1-10行的 old
:%s/old/new/gc        # 替换全文,每次替换前确认

可视模式

### 进入可视模式
v          # 字符可视模式
V          # 行可视模式
Ctrl+v     # 块可视模式
### 可视模式操作
y          # 复制选中内容
d          # 删除选中内容
c          # 修改选中内容
>          # 向右缩进
<          # 向左缩进

窗口和标签页

### 窗口分割
:sp [file]     # 水平分割窗口
:vsp [file]    # 垂直分割窗口
Ctrl+w s       # 水平分割当前窗口
Ctrl+w v       # 垂直分割当前窗口

Ctrl+w h       # 切换到左窗口
Ctrl+w j       # 切换到下窗口
Ctrl+w k       # 切换到上窗口
Ctrl+w l       # 切换到右窗口
Ctrl+w w       # 循环切换窗口

Ctrl+w +       # 增加窗口高度
Ctrl+w -       # 减少窗口高度
Ctrl+w =       # 平均窗口大小
:q             # 关闭当前窗口
### 标签页
:tabnew [file] # 新建标签页
:tabnext       # 下一个标签页
:tabprevious   # 上一个标签页
:tabclose      # 关闭当前标签页
:tabonly       # 关闭其他标签页

gt            # 下一个标签页
gT            # 上一个标签页
5gt           # 切换到第5个标签页

文件操作

### 文件管理
:e filename    # 打开文件
:enew          # 新建文件
:w             # 保存文件
:w filename    # 另存为
:wq            # 保存并退出

:r filename    # 插入文件内容
:r !command    # 插入命令输出
### 文件浏览
```bash
:Explore       # 文件浏览器
:Sexplore      # 水平分割文件浏览器
:Vexplore      # 垂直分割文件浏览器

高级编辑技巧

### 宏录制
qa            # 开始录制宏到寄存器 a
q             # 停止录制
@a            # 执行寄存器 a 的宏
@@            # 重复上次执行的宏
### 标记
ma            # 设置标记 a
'a            # 跳转到标记 a
`a            # 跳转到标记 a 的精确位置
:marks        # 查看所有标记
### 缩进
>>            # 向右缩进当前行
<<            # 向左缩进当前行
>%            # 缩进匹配的括号区域
=%            # 自动缩进匹配的括号区域
:set autoindent       # 自动缩进
:set smartindent      # 智能缩进
:set shiftwidth=4     # 设置缩进宽度

配置和自定义


### 常用配置选项
```bash
:set number          # 显示行号
:set nonumber        # 隐藏行号
:set relativenumber  # 显示相对行号

:set syntax=on       # 语法高亮
:set paste           # 粘贴模式
:set nopaste         # 关闭粘贴模式

:set tabstop=4       # Tab 显示为4个空格
:set expandtab       # 将 Tab 转换为空格
:set shiftwidth=4    # 自动缩进使用4个空格

:set hlsearch        # 高亮搜索结果
:set incsearch       # 实时搜索
:set ignorecase      # 忽略大小写
:set smartcase       # 智能大小写
### 永久配置
在 `~/.vimrc` 文件中添加配置:
```vim
" 基本设置
set number
set relativenumber
set syntax=on
set hlsearch
set incsearch
set ignorecase
set smartcase

" 缩进设置
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
set smartindent

" 其他设置
set backspace=indent,eol,start
set mouse=a
set encoding=utf-8

重定向符号

符号 作用 示例
> 标准输出重定向(覆盖) ls > file.txt
>> 标准输出重定向(追加) echo "text" >> file.txt
2> 标准错误重定向(覆盖) command 2> error.log
2>> 标准错误重定向(追加) command 2>> error.log
&> 标准输出和错误重定向 command &> output.log
< 标准输入重定向 sort < input.txt
<< Here Document cat << EOF
<<< Here String grep "x" <<< "text"
\| 管道 ls \| grep ".txt"
tee 分流输出 ls \| tee file.txt

1. 什么是重定向?
重定向就是改变命令默认的输入/输出目标。
· 默认情况下,命令从键盘(标准输入) 获取输入
· 将结果输出到屏幕(标准输出)
· 将错误信息输出到屏幕(标准错误)
重定向让我们可以将这些输入输出重定向到文件、设备或其他命令。

2. 标准文件描述符
文件描述符 名称 默认设备 缩写
0 标准输入 (stdin) 键盘 <
1 标准输出 (stdout) 屏幕 >
2 标准错误 (stderr) 屏幕 2>

输出重定向详解

3. 输出重定向详解

 3.1 基本输出重定向
# 将标准输出重定向到文件(覆盖)
command > file.txt
# 将标准输出重定向到文件(追加)
command >> file.txt
实例:
# 将 ls 的结果保存到文件(覆盖)
ls -l > file_list.txt
# 将日期追加到日志文件
date >> logfile.log
# 将多个命令的输出重定向
{ date; whoami; pwd; } > system_info.txt

 3.2 标准错误重定向
# 将标准错误重定向到文件(覆盖)
command 2> error.log
# 将标准错误重定向到文件(追加)
command 2>> error.log
# 将标准错误丢弃(发送到 /dev/null)
command 2> /dev/null
实例:
# 查找文件,将错误信息保存到文件
find / -name "*.conf" 2> errors.log
# 运行脚本,忽略所有错误信息
./script.sh 2> /dev/null

 3.3 同时重定向标准输出和标准错误
# 方法1:分别重定向到不同文件
command > output.log 2> error.log
# 方法2:都重定向到同一个文件
command > combined.log 2>&1
command &> combined.log          # 简写形式(推荐)
command >& combined.log          # 另一种简写
# 方法3:都追加到同一个文件
command >> combined.log 2>&1
command &>> combined.log         # 简写形式
实例:
# 编译程序,输出和错误分开保存
gcc program.c > compile_output.txt 2> compile_errors.txt
# 运行脚本,所有输出都保存到日志
./server.sh &> server.log
# 追加模式记录日志
./daily_task.sh &>> daily.log

输入重定向详解

4. 输入重定向详解
 4.1 基本输入重定向
# 从文件读取输入(而不是键盘)
command < input.txt
实例:
# 从文件读取邮件内容发送
mail -s "Subject" user@example.com < message.txt
# 统计文件行数(wc 默认接受文件名,但这样可以演示重定向)
wc -l < /etc/passwd
# 排序文件内容
sort < unsorted_list.txt > sorted_list.txt

 4.2 多行输入(Here Document)
command << DELIMITER
输入内容...
多行内容...
DELIMITER
实例:
# 向 cat 命令提供多行输入
cat << EOF
这是第一行
这是第二行
这是第三行
EOF
# 在脚本中创建配置文件
cat > config.txt << END
server_name = localhost
port = 8080
timeout = 30
END

 4.3 字符串输入(Here String)
# 将字符串作为命令输入
command <<< "字符串内容"
实例:
# 将字符串传递给 grep 搜索
grep "hello" <<< "hello world, this is a test"
# 计算字符串单词数
wc -w <<< "This is a test string"
# 转换为大写
tr 'a-z' 'A-Z' <<< "hello world"

管道详解

管道将一个命令的输出作为另一个命令的输入。
# 基本管道
command1 | command2
# 多个管道
command1 | command2 | command3
实例:
# 查看进程并搜索
ps aux | grep nginx
# 统计当前目录文件数量
ls -1 | wc -l
# 显示大文件并排序
find . -type f -size +100M | sort -nr
# 复杂的管道操作
cat access.log | grep "ERROR" | cut -d' ' -f1 | sort | uniq -c | sort -nr

cat - 主要用于查看、创建和合并文件内容

基本语法

cat [选项] [文件]...
常用选项
选项-n 显示行号(包括空行) cat -n log.txt
选项-b 显示行号(忽略空行) cat -b script.sh
选项-s 压缩连续空行为一行 cat -s config.conf
选项-A 显示所有控制字符(相当于-vET) cat -A binary.log
选项-E 每行末尾显示$符号 cat -E file.txt
选项-T 将Tab显示为^I cat -T file.txt
选项-v 显示非打印字符 cat -v data.bin

用法举例

# 查看单个文件
cat file.txt
# 查看多个文件(依次显示)
cat file1.txt file2.txt
# 查看文件并显示行号(实用!)
cat -n file.txt
# 示例输出:
#   1  This is line one
#   2  This is line two
#   3  This is line three
# 显示行号(包括空行)
cat -b file.txt  # 只给非空行编号
cat -n file.txt  # 给所有行编号
2. 创建新文件(简易编辑器)
cat > newfile.txt
Hello World!
This is a new file.
[按 Ctrl+D]
# 追加内容到文件
cat >> existing.txt
Additional content here.
[按 Ctrl+D]
3. 合并/复制文件
# 合并多个文件为一个新文件
cat file1.txt file2.txt > combined.txt
# 合并并追加到现有文件
cat file1.txt file2.txt >> all_files.txt
# 复制文件内容(类似cp,但处理的是内容流)
cat source.txt > destination.txt
4. 结合重定向使用
# 从标准输入读取并写入文件
cat > output.txt << EOF
第一行
第二行
EOF
# 将键盘输入和文件内容合并
cat - file.txt > combined.txt
# 这时会先等待你输入内容(按Ctrl+D结束),再追加file.txt内容

实用技巧和场景

场景1:快速查看日志
# 查看最后100行日志(配合tail)
cat /var/log/syslog | tail -100
# 查看带行号的配置文件
cat -n /etc/nginx/nginx.conf | head -50
场景2:文件拼接与处理
# 合并多个文本文件
cat chapter1.txt chapter2.txt > book.txt
# 创建多行配置文件
cat > docker-compose.yml << 'EOF'
version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
EOF
场景3:调试脚本/代码
cat -nT script.sh
# 输出:
#   1  #!/bin/bash^I^I
#   2  echo "Hello"^I^I
#   3  ^I^I# 注释
场景4:简单数据查看
# 查看CSV文件前几行
cat data.csv | head -5
# 统计多个文件的总行数
cat *.log | wc -l

head - 开头部分内容

head 命令用于显示文件的开头部分内容。它非常适合:
· 查看日志文件的开头
· 预览文件内容
· 检查文件格式
· 获取文件的前几行数据

命令语法

head [选项] [文件]...
 常用选项详解
选项 长选项 描述
选项-n NUM --lines=NUM 显示前 NUM 行(默认显示 10 行)
选项-c NUM --bytes=NUM 显示前 NUM 个字节
选项-q --quiet 静默模式,不显示文件名标题
选项-v --verbose 详细模式,总是显示文件名标题

基本用法与实例

显示文件开头部分
# 创建测试文件
seq 1 20 > numbers.txt  # 生成 1-20 的数字,每行一个
# 显示前10行(默认)
head numbers.txt
# 显示前5行
head -n 5 numbers.txt
head -5 numbers.txt     # 简写形式
# 显示前100个字节
head -c 100 filename.txt
head -c 1K filename.txt  # 1KB
head -c 1M filename.txt  # 1MB
实例输出:
$ seq 1 20 > numbers.txt
$ head -n 5 numbers.txt
1
2
3
4
5
######
显示多个文件
# 显示多个文件的前10行
head file1.txt file2.txt file3.txt
# 显示多个文件的前5行
head -n 5 file1.txt file2.txt
实例:
# 创建测试文件
echo "文件1内容" > file1.txt
echo -e "文件2\n第二行" > file2.txt
$ head -n 2 file1.txt file2.txt
==> file1.txt <==
文件1内容

==> file2.txt <==
文件2
第二行
######
静默模式和详细模式
# 详细模式(总是显示文件名)
head -v file1.txt
# 输出:
# ==> file1.txt <==
# 文件内容...
# 静默模式(不显示文件名)
head -q file1.txt file2.txt
# 只输出内容,不显示分隔符
# 默认行为(多个文件时显示文件名,单个文件时不显示)
head file1.txt          # 不显示标题
head file1.txt file2.txt # 显示标题
######
高级用法与实用技巧
# 查看命令输出的前几行
ls -la | head -5
# 查看进程列表的前几个
ps aux | head -10
# 查看日志文件的开头
cat /var/log/syslog | head -20
# 组合使用
grep "ERROR" /var/log/app.log | head -5
######
查看二进制文件开头
# 查看可执行文件的头部信息
head -c 100 /bin/ls | file -  # 结合 file 命令判断类型
# 查看图片文件头
head -c 50 image.jpg | xxd  # 用十六进制显示
# 查看压缩文件头
head -c 100 archive.zip | file -

实际应用场景

场景1:日志文件分析
# 查看最新的日志文件开头
head -n 50 /var/log/syslog
# 查看今天最早的几条日志
grep "$(date +'%b %d')" /var/log/syslog | head -10
# 查看应用启动日志
head -n 100 /var/log/nginx/access.log
场景2:配置文件预览
# 查看配置文件开头,了解格式和选项
head -n 20 /etc/ssh/sshd_config
# 查看多个配置文件的开头
head -n 5 /etc/passwd /etc/group /etc/shadow
# 检查配置文件的注释说明
head -n 30 /etc/nginx/nginx.conf | grep -E "^#|^$"
场景3:数据处理
# 预览CSV/TSV文件的头部(标题和几行数据)
head -n 5 data.csv
# 检查数据格式
head -c 200 data.json
# 查看数据库导出的开头
head -n 10 database_dump.sql
# 检查文件编码
head -n 1 file.txt | file -
场景4:系统监控
# 查看当前最耗CPU的前5个进程
ps aux --sort=-%cpu | head -n 6  # 第一行是标题
# 查看磁盘使用情况
df -h | head -n 5
# 查看内存使用情况
free -h | head -n 3
# 查看系统负载历史
uptime | head -n 1

tail - 查看文件末尾内容

核心语法

tail [选项] 文件名
常用选项及实例(高频必记)
选项 -n 行数:指定显示末尾N行(可省略 n ,直接写 -数字 )
- 例: tail -n 5 test.log  或  tail -5 test.log  → 显示test.log最后5行。
选项 -f:实时追踪文件新增内容(日志监控最常用)
- 例: tail -f /var/log/messages  → 实时刷新显示系统日志的新内容,按 Ctrl+C 退出。
选项 -F:=  -f + -r ,文件被删除/重建后仍能继续追踪(比 -f 更稳定)
- 例: tail -F app.log  → 应对日志切割(如按天生成新日志文件)场景。
选项 -c 字节数:按字节数显示末尾内容(而非行数)
- 例: tail -c 100 test.txt  → 显示test.txt最后100个字节的内容。
########
- 实时监控并显示行号: tail -f -n 20 test.log | nl 
- 同时追踪多个文件: tail -f log1.log log2.log (会标注内容来自哪个文件)

more - 分页阅读工具

more命令是Linux/Unix中按分页方式浏览文件内容的基础命令,适用于查看长文件,支持逐屏滚动,不支持向上翻页(需按 q 退出)。

完整语法与参数解析

核心语法
more [选项] 文件名
常用选项及实例
选项 -num:指定每页显示的行数(num为数字)
- 例: more -20 test.log  → 每页显示test.log的20行内容。
选项 +num:从文件第num行开始显示,而非从头开始
- 例: more +50 config.cfg  → 直接从config.cfg的第50行开始浏览。
选项 -d:显示操作提示(“Press space to continue, 'q' to quit”),避免误操作
- 例: more -d router.log  → 新手友好,每页底部都有操作指引。
关键操作快捷键
空格键:向下翻一页
Enter键:向下翻一行
/字符串:在当前文件中向下搜索“字符串”(按 n 找下一个匹配)
q:立即退出more命令
=:显示当前阅读的行号

less - 最强的分页阅读工具

less命令是Linux/Unix系统中功能最强的分页阅读工具,堪称 more 的“升级版”,核心优势是支持上下自由滚动、全屏搜索、实时更新,完美适配麒麟系统下网络设备(H3C/迪普)配置文件查看、日志排障等场景,是运维人员查看长文本的“首选工具”。

完整语法与核心参数

基础语法
less [选项] [文件名]
# 支持管道输入(接收其他命令输出)
命令 | less [选项]
# 读取多个文件(按:n切换下一个,:p切换上一个)
less 文件1 文件2 文件3
#####
高频必用选项(含运维场景注解)
选项 功能描述 运维实战案例 
选项 -N  显示每行的行号(查看配置文件定位关键段落必备)  less -N dp_firewall.cfg  → 查看迪普防火墙配置,行号清晰,方便对照文档修改 
选项 -i  搜索时忽略大小写(避免因大小写差异漏查关键词)  less -i h3c_switch.log  → 搜索“Error”时,同时匹配“error”“ERROR” 
选项 -m  显示百分比进度(底部显示“Lines 1-50/1000 (5%)”)  less -m system_init.log  → 查看超长系统日志,明确阅读进度 
选项 -f  强制打开文件(忽略文件不存在、权限不足等警告)  less -f /var/log/secure  → 即使日志文件权限为只读,也能强制查看 
选项 -r  正确显示控制字符(如换行符、制表符,避免乱码)  less -r json_format.log  → 查看设备输出的JSON日志,保持格式工整 
选项 -S  禁止长行自动折行(长行超出屏幕部分隐藏,按右箭头查看)  less -S long_line_config.txt  → 查看一行写死的路由配置,避免折行导致命令断裂 
选项 -X  退出less后不清除屏幕内容(保留浏览记录,方便后续对照)  less -X network_report.txt  → 退出后终端仍显示报告内容,可直接复制关键信息
#######
冷门但实用选项
选项  -t 标签 :直接跳转到文件中定义的“标签”位置(需文件含标签,如man文档)
选项  -e :阅读到文件末尾时自动退出(无需手动按q)
选项  -F :若文件内容少于一屏,直接显示全部内容并退出(等同于cat的轻量用法)

核心操作快捷键(运维高频)

进入less界面后,所有操作通过快捷键完成,按 h 可查看完整帮助手册,以下是运维场景必记的核心快捷键:
滚动控制(自由上下翻页)
# ↑ / ↓ 箭头:向上/向下翻1行(精细浏览配置命令)
# PageUp / PgUp:向上翻1整页
# PageDown / PgDn:向下翻1整页
# Ctrl+F:向下翻1页(同PgDn)
# Ctrl+B:向上翻1页(同PgUp)
# G:跳转到文件最后一行(查看日志最新内容)
# g:跳转到文件第一行(重新浏览配置开头)
# nG:跳转到第n行(如 50G →直接到第50行,定位配置段落)
# Ctrl+D:向下翻半页(小幅度滚动,避免错过关键内容)
# Ctrl+U:向上翻半页

搜索与匹配(排障核心功能)
# /关键词:从当前位置向下搜索“关键词”(如 /deny →查找被拒绝的流量日志)
# ?关键词:从当前位置向上搜索“关键词”(反向查找,适合漏看的匹配内容)
# n(next):跳转到下一个匹配结果(连续查找相同关键词)
# N(Next):跳转到上一个匹配结果(反向查找匹配项)
# &模式:仅显示匹配“模式”的行,隐藏其他内容(过滤无关日志)
# 例:输入 &error →仅显示含“error”的日志行,快速聚焦故障信息

文件操作与退出
# q:立即退出less(最常用,无论当前位置)
# :q:等同于 q ,兼容vi操作习惯
# :n:切换到下一个文件(当打开多个文件时,如 less a.log b.log )
# :p:切换到上一个文件
# v:调用系统默认编辑器(如vim)打开当前文件(浏览时发现错误,直接编辑)
# !命令:在不退出less的情况下执行Linux命令(执行完按Enter返回)
# 例:按 !ifconfig eth0 →临时查看网卡信息,返回后继续浏览

其他实用操作
# =(等号):显示当前行号、文件总行数、百分比进度(定位配置位置)
# Ctrl+L:刷新屏幕(日志实时更新时,刷新显示最新内容)
# h:查看完整快捷键帮助手册(忘记命令时救命用)
# 空格:向下翻1页(同PgDn,兼容more用户习惯)

运维场景专属实战案例

案例1:带行号查看交换机配置,快速定位端口
H3C交换机配置文件长达上千行,用 -N 显示行号,配合搜索定位指定端口:
less -N h3c_s5820_config.cfg
# 操作:
# 1. 输入/GigabitEthernet 0/24 → 快速定位到24号端口配置
# 2. 按= → 显示“Line 320 of 1250 (25%)”,明确端口配置在第320行
# 3. 按v → 进入vim编辑,修改端口VLAN配置后保存退出,自动回到less界面

案例2:实时监控防火墙日志,过滤错误信息
用 tail -f 实时追踪迪普防火墙日志,通过 less 的 &模式 过滤仅显示错误日志
tail -f /var/log/dp/access.log | less -i
# 操作:
# 1. 输入&error → 仅显示含“error”的日志(忽略大小写)
# 2. 按Ctrl+L → 刷新屏幕,查看最新错误日志
# 3. 按q → 同时退出tail和less
 
案例3:查看超长行JSON日志,避免折行
网络设备输出的JSON日志一行极长,用 -S 禁止折行,按右箭头查看完整内容:
less -S h3c_router_json.log
# 操作:
# 1. 按→箭头 → 横向滚动查看超长行的完整JSON字段
# 2. 输入/"src_ip":"192.168.1.1" → 精准搜索源IP为192.168.1.1的日志
 
案例4:同时查看多个日志文件,切换对比
排查故障时需对比系统日志和应用日志,用less打开多个文件,快速切换:
less /var/log/messages /var/log/app.log
# 操作:
# 1. 输入:n → 切换到app.log
# 2. 输入:p → 切回messages.log
# 3. 按&warning → 同时在两个文件中过滤警告信息

案例5:仅显示含指定IP的日志,过滤冗余信息
less /var/log/dp/firewall.log
# 操作:输入&10.0.0.5 → 仅显示所有含“10.0.0.5”的日志,快速定位该IP的流量记录

案例6:退出后保留浏览记录,方便复制
查看网络巡检报告,退出后保留内容,直接复制关键数据:
less -X network_check_report.txt
# 操作:
# 1. 浏览完按q退出
# 2. 终端仍显示报告内容,直接选中复制带宽、丢包率等关键指标

less vs more

功能 less more 运维场景选型建议 
上下滚动 支持(↑↓/PgUp/PgDn) 仅支持向下,向上需管道 查看配置文件(需反复上下对照)→ 用less;快速浏览短日志→用more 
搜索 支持上下搜索、过滤显示 仅支持向下搜索 故障排查(需反向查找关键词)→ 用less 
实时更新 支持(Ctrl+L刷新) 支持(需配合tail -f) 实时监控日志→两者均可,less可过滤更灵活 
多文件查看 支持(:n/:p切换) 不支持 对比多个配置/日志文件→必须用less 
编辑功能 支持(v调用vim) 支持(v调用编辑器) 浏览时需修改内容→两者均可,less体验更流畅 

cut - 提取文件中指定字段的

1. 什么是 cut 命令?
cut 命令主要用于从文件的每一行中提取指定的部分(字段)。它类似于其他编程语言中的 split() 或 substring() 函数。
主要用途:
· 提取 CSV/TSV 文件中的特定列
· 从结构化日志中获取特定信息
· 处理以固定分隔符分隔的文本
· 提取固定宽度的字段

命令语法

cut [选项] [文件]
三种主要模式
模式 选项 描述
按字段提取 -f 使用分隔符分隔字段(默认分隔符是TAB)
按字符提取 -c 提取指定位置的字符
按字节提取 -b 提取指定位置的字节(对于ASCII文本与-c相同)
常用选项详解
选项 描述
选项-f LIST 字段选择,LIST 指定要提取的字段编号(从1开始)
选项-d DELIM 指定分隔符,与 -f 一起使用
选项-c LIST 字符选择,提取指定位置的字符
选项-b LIST 字节选择,提取指定位置的字节
选项-s 静默模式,不输出不包含分隔符的行
选项--complement 反选,输出未选中的部分
选项--output-delimiter=STRING 指定输出分隔符

基本用法与实例

按字段提取(使用 -f 和 -d)
# 创建测试文件
echo -e "张三:25:北京:工程师\n李四:30:上海:经理" > data.txt
# 提取第一列(姓名)
cut -d ':' -f 1 data.txt
# 输出:
# 张三
# 李四
# 提取第一列和第三列
cut -d ':' -f 1,3 data.txt
# 输出:
# 张三:北京
# 李四:上海
# 提取第二列到第四列
cut -d ':' -f 2-4 data.txt
# 输出:
# 25:北京:工程师
# 30:上海:经理

按字符提取(使用 -c)
# 创建固定宽度的测试文件
echo -e "ID001   张三    25\nID002   李四    30" > fixed.txt
# 提取第1-5个字符(ID)
cut -c 1-5 fixed.txt
# 输出:
# ID001
# ID002
# 提取第6-10个字符(姓名,注意包含空格)
cut -c 6-10 fixed.txt
# 输出:
#    张
#    李
# 提取多个不连续的位置
cut -c 1-5,11-12 fixed.txt
# 输出:
# ID00125
# ID00230

按字节提取(使用 -b)
# 对于ASCII文本,-b 和 -c 基本相同
cut -b 1-3 data.txt
# 但对于多字节字符(如中文),有区别
echo "中文测试" | cut -b 1-3  # 可能只截取部分字节,导致乱码
echo "中文测试" | cut -c 1-2  # 正确:提取前两个字符

指定范围的各种写法

# 创建测试文件
seq 1 10 | paste -sd: > numbers.txt
# 内容:1:2:3:4:5:6:7:8:9:10
# 单个字段
cut -d ':' -f 3 numbers.txt    # 输出:3
# 连续范围
cut -d ':' -f 3-5 numbers.txt  # 输出:3:4:5
cut -d ':' -f 1-3 numbers.txt  # 输出:1:2:3
# 从开始到某字段
cut -d ':' -f -3 numbers.txt   # 输出:1:2:3
# 从某字段到结束
cut -d ':' -f 5- numbers.txt   # 输出:5:6:7:8:9:10
# 多个不连续字段
cut -d ':' -f 1,3,5 numbers.txt  # 输出:1:3:5
cut -d ':' -f 1,3-5 numbers.txt  # 输出:1:3:4:5

反选功能(--complement)
# 提取除了第一列以外的所有列
cut -d ':' -f 1 --complement data.txt
# 输出:
# 25:北京:工程师
# 30:上海:经理
# 提取除了第2-3列以外的所有列
cut -d ':' -f 2-3 --complement data.txt
# 输出:
# 张三:工程师
# 李四:经理

自定义输出分隔符
# 默认使用输入分隔符
cut -d ':' -f 1,3 data.txt
# 输出:张三:北京
# 自定义输出分隔符
cut -d ':' -f 1,3 --output-delimiter=' -> ' data.txt
# 输出:
# 张三 -> 北京
# 李四 -> 上海
# 使用空格作为输出分隔符
cut -d ':' -f 1,3 --output-delimiter=' ' data.txt

静默模式
# 创建混合文件(有些行没有分隔符)
echo -e "一行\nname:age\n另一行" > mixed.txt
# 不加 -s,所有行都输出
cut -d ':' -f 1 mixed.txt
# 输出:
# 一行        ← 没有分隔符,输出整行
# name        ← 有分隔符,输出第一字段
# 另一行      ← 没有分隔符,输出整行
# 加 -s,只输出包含分隔符的行
cut -d ':' -f 1 -s mixed.txt
# 输出:
# name        ← 只有这行包含分隔符