文章目录
一、创建链接文件-ln
为文件或目录建立链接文件,类似于Windows系统的快捷方式链接文件类型。
链接文件类型
-
软链接(又称为符号链接)
inode号不一样
创建软链接ln [-s] 源文件或目录... 链接文件或目标位置
-
硬链接
INode号一样
创建硬链接ln 源文件或目录... 链接文件或目标位置
主要区别
创建的符号链接文件
1、允许创建的位置 软/硬有区别的
2、占用磁盘空间 有区别的
3、创建的对象 不同
符号链接 | 与源文件大小 | inode号 | 文件属性 | 删除源文件后 |
---|---|---|---|---|
软链接 | 不一样 | 不一样 | 指向源文件 | 不能查看 |
硬链接 | 一样 | 一样 | 独立文件 | 正常查看 |
在 Linux 中,文件名和文件的数据是分开存储的。
提示
- 在 Linux中,只有文件的硬链接数==0才会被删除
- 使用
ls-l
可以查看一个文件的硬链接的数量 - 在日常工作中,几乎不会建立文件的硬链接,知道即可
引申原理
在文件系统中找文件,文件本身就是指向磁盘中的存储块,本身就是个硬链接。
-
硬链接
硬链接也是在磁盘中的存储块找文件,因此inode值与文件本身一样。
-
软链接
只是一个快捷方式
删除新建文件后的区别
删除后重复创建相同文件名、不同内容的文件
- 软链接:指向文件名,内容与新建文件一致
- 硬链接:不受影响,依然是源文件
验证硬链接占用空间的小实验
cp /var/log/messages ./ ##拷贝文件
ln messages msag ##创建硬链接1
ln messages m ##创建硬链接2
ln messages a ##创建硬链接3
du -h ##查看磁盘占用
硬软链接优缺点
软链接(Symbolic Link)
优点:
- 可以跨文件系统:软链接可以指向不同文件系统中的文件。
- 指向目录:软链接可以指向目录,方便快捷地访问目标目录。
- 动态链接:如果目标文件被删除或移动,软链接会变成断开的链接(dangling link),但不会占用多余的空间。
缺点:
- 性能较差:访问软链接时需要额外的步骤来解析链接并定位目标文件,性能比硬链接稍差。
- 容易失效:如果目标文件被删除或移动,软链接会失效,变成断开的链接。
- 不支持文件系统级别的备份:一些文件系统备份工具可能不会正确备份软链接和其目标文件。
适用场景:
软链接适用于需要创建快捷方式、跨文件系统引用文件、或指向目录的情况。
硬链接(Hard Link)
优点:
- 高效:硬链接直接指向数据块,性能较高,无需额外的解析步骤。
- 可靠性:即使目标文件被删除,硬链接仍然存在并可以访问文件内容,除非所有硬链接都被删除。
- 节省空间:硬链接只是增加了一个目录项,没有创建新的文件,占用的磁盘空间非常少。
缺点:
- 不能跨文件系统:硬链接只能在同一个文件系统中创建,无法跨越不同的文件系统。
- 不能指向目录:硬链接只能指向文件,不能指向目录。
- 混淆和复杂性:多个硬链接指向同一个文件,可能会造成管理和维护上的混淆,难以确定哪些链接实际指向同一个文件。
适用场景:
硬链接适用于需要高效访问文件、增加文件引用、或确保文件内容在目标文件被删除后仍可访问的情况。
二、复制文件或目录-cp
将需要复制的文件或目录(源)重建一份,并保存为新的文件或目录
格式
cp [选项]... 源文件或目录... 目标文件或目录...
常用选项:-f、-i、-p、-r
cp的常用选项:
-f:覆盖目标同名文件或目录时不进行提醒,而直接强制复制
-i:覆盖目标同名文件或目录时提醒用户确认
-p:复制时保持源文件的权限、属主及时间标记等属性不变(用的多)
-r:复制目录时必须使用此选项,表示递归复制所有文件及子目录
-a:完整保留所有的信息包括连接文件,可以直接复制目录
注:复制多个文件或目录时,目标位置必须是目录,且目标目录必须已存在
拓展:
全量复制:cp
复制全部文件,只能在本地复制
增量复制:rsync
只复制新增加的部分,可以跨主机复制(消耗资源更低速度更快)
更多cp
命令的一些选项:
选项 | 描述 |
---|---|
-r 或 -R | 递归复制目录及其内部的所有内容(包括子目录和文件)。这是复制整个目录结构时必需的选项。 |
-p | 保留文件的属性,包括修改时间、访问权限(如所有者、组、权限模式)和时间戳等。这有助于保持文件系统的原样复制。 |
-v | 显示详细的复制过程,包括被复制的文件和目录的名称。这有助于跟踪复制操作或调试问题。 |
-f | 强制复制,不提示确认即覆盖目标文件或目录。这可以避免在复制过程中因覆盖文件而中断。 |
-i | 在覆盖目标文件之前询问用户是否确认。这提供了额外的安全性,防止意外覆盖重要文件。 |
-a | 归档模式,相当于同时使用-dR --preserve=all选项。它保留了源文件的几乎所有属性,包括链接、文件属性,并递归复制目录。这是进行完整备份时常用的选项。 |
-u | 只有当源文件比目标文件更新或目标文件不存在时,才进行复制。这有助于避免复制已经是最新的文件。 |
-l | 创建硬链接而不是复制文件内容。这会在文件系统中创建一个指向原始文件的链接,而不是复制文件本身。注意,硬链接不能跨文件系统创建,也不能用于目录。 |
-s | 创建符号链接(软链接)而不是复制文件。符号链接类似于Windows中的快捷方式,它包含了目标文件的路径。 |
–backup | 在覆盖文件之前,对目标文件进行备份。这有助于恢复被覆盖的文件。可以使用不同的选项来指定备份文件的命名方式,如–backup=numbered(备份文件名为原始文件名加上一个数字后缀)。 |
三、删除文件或目录-rm
删除指定的文件或目录
格式
rm [选项] 要删除的文件或目录...
rm的常用选项:
-f:删除文件或目录时不进行提醒,而直接强制删除
-i:删除文件或目录时提醒用户确认。(y表示删除,n表示不删除)
-r:删除目录时必须使用此选项,表示递归删除整个目录树(应谨慎使用)
示例
rm -rf public_html/grub/
rm -i public html/apg.conf
rm -rf /etc/yum.repos.d/*
高危命令
高危命令之一:rm -rf /etc/profile
高危命令之二:rm -rf ./*
注意
- 不要直接删除系统中已有的目录或配置文件,以避免出现意外故障。
- 删除目录下文件时建议最好先切换到目录下再执行rm -rf命令
- 尽量以相对命令的方式删除
- 高危命令之一:rm -rf /etc/profile
- 高危命令之二:rm -rf ./*
rm
命令在删除文件或目录时不会将其移动到回收站或垃圾箱,而是直接从文件系统中删除- 为了安全起见,尽量使用
rm
命令的-i
选项进行交互式确认
cd /etc/yum.repos.d/
rm -rf ./*
更多rm
命令的一些选项:
选项 | 描述 |
---|---|
-r 或 -R | 递归地删除目录及其内部的所有内容(包括子目录和文件)。默认情况下,rm命令只删除文件,而不会删除目录,除非使用了此选项。 |
-f 或 --force | 强制删除文件或目录,不提示确认。即使文件不存在或没有写权限,也不会显示错误消息。请注意,使用此选项时要格外小心,以免意外删除重要文件。 |
-i 或 --interactive | 在删除文件或目录之前询问用户是否确认。这对于防止意外删除非常有用。如果指定了多个文件或目录,rm命令会为每个文件或目录显示一个确认提示。 |
-I | 在删除超过三个文件或进行递归删除之前要求确认。这个选项比-i选项提供的提示更少,但仍然可以防止大多数错误发生。 |
-v 或 --verbose | 显示详细的删除过程,包括被删除的文件或目录的名称。这有助于跟踪删除操作或确认哪些文件已被删除。 |
-d 或 --dir | 删除空目录。如果目录不为空,则不会删除,并且会显示错误消息。这个选项通常与-r选项一起使用来删除目录及其内容,但单独使用时仅删除空目录。 |
-q | 删除文件时不显示任何消息 |
–preserve-root | 防止rm命令删除根目录(/)及其内容。(重要的安全措施) |
四、修改命令别名-alias(不常用)
一般用于临时修改,不常用
临时修改
格式
alias 命令别名 = '命令'
unalias 别名命令 ##删除别名
示例
alias mynetwork='vim /etc/sysconfig/network-scripts/ifcfg-ens33'
永久修改(更不用)
在/etc/.bashrc 会影响全部
/root/.bashrc 只影响当前用户(当前用户的家目录)root
五、移动/重命名文件或目录-mv
将指定的文件或目录转移位置
如果目标位置与源位置相同,则相当于执行重命名操作
格式:
mv [选项] ... 源文件或目录... 目标文件或目录
示例:
mv mytouch mkfile
mv mkfile public_html/
mv
命令的一些常用选项:
选项 | 描述 |
---|---|
-i 或 --interactive | 在覆盖目标文件之前提示用户确认。 |
-f 或 --force | 强制移动或重命名文件,不提示确认,并覆盖目标文件(如果目标文件是目录,则需要-r或-R选项)。 |
-n 或 --no-clobber | 不要覆盖任何已存在的文件(注意:在某些版本的mv中可能不可用或行为有所不同)。 |
-v 或 --verbose | 显示详细的移动或重命名过程。 |
-u 或 --update | 只在源文件比目标文件新,或目标文件不存在时移动文件。 |
-r 或 -R 或 --recursive | 递归移动目录及其内部的所有内容。 |
六、查看所有磁盘及其挂载目录的剩余空间-df
系统资源查询相关:
主要监控5大系统资源:磁盘空间、CPU、内存、I/O、进程信息
规范说法:使用一些日常的查询指令查看系统资源,如磁盘空间、CPU、内存、I/O、进程信息、网络流量监控
和磁盘相关的命令有:du、ls、df等
示例
[root@localhost opt]# df -h
输出结果:
结果解释:
- 前者(文件系统)为后者(挂载点)提供存储资源
- 主要看已用百分比
七、挂载文件系统-mount
将一个文件系统(如硬盘分区、光盘、网络文件系统等)连接到Linux系统的目录树中的某个目录上的过程。挂载之后,用户可以通过该目录访问文件系统中的数据。
基本概念
- 挂载点:挂载文件系统的目录。通常是一个空目录。
- 文件系统:存储数据的逻辑结构,可以是硬盘分区、USB设备、光盘或网络存储等。
功能
- 提供共享空间
- 共享数据
格式
mount [选项] 设备 文件夹 ##挂载文件系统
umount /dir ##卸载文件系统
- 设备:要挂载的文件系统设备,例如
/dev/sda1
。 - 文件夹:挂载点,例如
/mnt
。
mount
命令的常用选项:
选项 | 说明 | 示例 |
---|---|---|
-o | 指定多个挂载选项,选项之间用逗号分隔。例如:ro、rw、loop、nosuid、noexec等。 | mount -o ro,loop /dev/sda1 /mnt |
ro | 只读挂载 | mount -o ro /dev/sda1 /mnt |
rw | 读写挂载 | mount -o rw /dev/sda1 /mnt |
loop | 将一个文件作为块设备挂载,通常用于挂载ISO镜像文件 | mount -o loop image.iso /mnt |
nosuid | 禁止在挂载点运行set-user-identifier或set-group-identifier程序 | mount -o nosuid /dev/sda1 /mnt |
noexec | 不允许在挂载点执行任何二进制文件 | mount -o noexec /dev/sda1 /mnt |
nodev | 禁止设备文件在挂载点被解释 | mount -o nodev /dev/sda1 /mnt |
remount | 重新挂载已经挂载的文件系统,可以改变挂载选项 | mount -o remount,rw /mnt |
uid | 设置挂载点的所有者用户ID | mount -o uid=1000 /dev/sda1 /mnt |
gid | 设置挂载点的所有者组ID | mount -o gid=1000 /dev/sda1 /mnt |
umask | 设置挂载点的文件权限掩码 | mount -o umask=022 /dev/sda1 /mnt |
-t | 指定文件系统类型,如ext4、vfat、nfs等 | mount -t ext4 /dev/sda1 /mnt |
-a | 挂载/etc/fstab中定义的所有文件系统 | mount -a |
-v | 详细模式,显示挂载过程中的详细信息 | mount -v /dev/sda1 /mnt |
-n | 挂载时不更新/etc/mtab文件 | mount -n /dev/sda1 /mnt |
-r | 只读挂载,等同于-o ro | mount -r /dev/sda1 /mnt |
-w | 读写挂载,等同于-o rw | mount -w /dev/sda1 /mnt |
-l | 显示标签信息 | mount -l |
-f | 模拟挂载,用于测试挂载命令的正确性,不执行实际挂载操作 | mount -f /dev/sda1 /mnt |
示例
-
挂载一个分区:
sudo mount /dev/sda1 /mnt
将
/dev/sda1
分区挂载到/mnt
目录。 -
查看挂载信息:
mount
显示当前系统所有已挂载的文件系统。
-
挂载ISO镜像:
sudo mount -o loop /path/to/image.iso /mnt
将ISO镜像文件挂载到
/mnt
目录。 -
卸载文件系统:
sudo umount /mnt
将挂载在
/mnt
目录的文件系统卸载。
八、查找命令文件存放目录-which
用于查找当前主机有没有xx命令
搜索范围由环境变量 PATH 决定(echo $PATH)
(使用较少)
格式
which 命令|程序名 ##默认当找到第一个目标后不再继续查找
或
which -a 命令|程序名 ##在所有搜索路径中查找
示例
which history
which ls
which -a ls
which wget
结果输出:
注:使用 which 查找内部命令时,将找不到对应的程序
九、查找文件或目录-find
文件查找工具,它允许用户根据各种条件搜索文件系统中的文件和目录。
采用递归方式,根据目标的名称、类型、大小等不同属性进行精细查找
命令的特点:
- 精确查找
- 实时査找 遍历(慢)
- 支持查找条件较多
格式1:
find [查找范围] [查找条件表达式]
参数解释:
[查找范围]:查找文件或子目录的目录位置
[查找条件表达式]:查找条件类型
格式2:
find [查找路径] [查找条件] **[处理动作]**
参数解释:
[查找路径]:指定具体目标路径,默认为当前目录。
[查找条件]:可以对文件名、大小、类型、权限等标准进行查找:默认为找出指定路径下的所有文件
[处理动作]:对符合条件的文件做操作,默认输出至屏幕(print)
示例(exec选项):
查找opt目录下,所有大于1G的文件,然后把他们移动到etc目录下
find /opt/ -size +1G -type f
find /opt/ -size +1G -type f -exec mv {} /etc \;
查找到/opt日录下,1G以上的普通文件,然后将查找到的文件全部mv移动到etc里面
exec:和管道符类似,将 find /opt/ -size +1G -type f
的处理结果传参到{}里
my {} /etc \;
【处理动作】
格式3:
find [路径] [选项] [表达式] [动作]
- 路径:指定
find
命令开始搜索的目录。如果省略路径,则默认为当前目录。 - 选项:可选,用于控制
find
命令的行为,如搜索的最大深度、是否跨文件系统搜索等。 - 表达式:用于指定搜索条件,如文件名、文件类型、大小、修改时间等。多个表达式可以通过逻辑运算符(如
and
、or
、not
)组合使用。 - 动作:对匹配的文件执行的操作,如打印、删除、执行命令等。如果不指定动作,则默认为
print
,即打印出匹配文件的路径名。
find
命令的常用选项及其描述:
查找类型 | 选项(关键字) | 描述 |
---|---|---|
按名称查找 | -name | 根据目标文件的名称进行查找,允许使用“”及“?”通配符。如:,?,[],[^]。通配符要加双引号引起来。 |
按名称查找(不区分大小写) | -iname | 类似于-name,但搜索时不区分文件名的大小写。 |
按文件大小查找 | -size [+/-]# | 根据目标文件大小进行插找。其中#代表大小(c:字节,k:千字节,M:兆字节,G:吉字节),+表示大于,-表示小于,无符号表示正好等于。 |
按文件属主查找 | -user | 根据文件是否属于目标用户进行查找。用户可以是用户名或UID。 |
按文件所属组查找 | -group | 根据文件是否属于目标组进行查找。组可以是组名或GID。 |
按文件类型查找 | -type | 根据文件的类型进行查找。常见的类型包括f(普通文件)、d(目录)、l(符号链接)、b(块设备文件)、c(字符设备文件)、s(套接字文件)、p(管道文件)等。 |
按inode号查找 | -inum | 根据文件inode号查找。inode是文件系统中用于唯一标识文件的元数据。 |
按权限查找 | -perm | 按文件权限查找,可以指定具体的权限模式。可以是八进制数(如644)或符号模式(如u=rwx,g=rx,o=r)。 |
最大搜索目录深度 | -maxdepth level | 将搜索限制在指定的最大目录深度以内。level是一个非负整数,表示目录的深度。 |
最小搜索目录深度 | -mindepth level | 从指定的最小目录深度开始搜索。这有助于避免在顶层目录本身中查找匹配项。 |
以下不重要 | ——— | ——— |
查找具有特定权限的文件(精确匹配) | -perm /mode | 查找任何一位权限匹配的文件。如果文件权限位中有任何一位与指定的模式匹配,则该文件符合条件。 |
查找所有权限都不匹配的文件 | -perm -mode | 查找所有权限位都严格匹配的文件。文件权限必须完全匹配指定的模式。 |
执行对匹配文件的命令 | -exec command {} ; | 对匹配的每个文件执行指定的命令。{}是一个占位符,代表当前匹配的文件名。命令的末尾必须是;来终止-exec选项。 |
忽略错误 | -ignore_readdir_race | 在处理大量文件时,如果某些文件在查找过程中被删除或修改,可能会导致错误。此选项可以忽略这些错误。 |
排除特定目录 | -path … -prune -o … -print | 使用-path和-prune选项结合逻辑表达式来排除特定目录或文件路径的搜索。-o(或)操作符用于指定在排除条件不满足时执行的操作。 |
查找并删除文件 | -exec rm {} ; | 警告:这个组合选项会直接删除匹配的文件,务必谨慎使用。 |
按最后修改时间查找 | -mtime n | modify time(修改时间),根据文件的最后修改时间进行查找。n 是一个整数,表示距离现在 n24 小时之前被修改的文件。如果 n 前面有 + 符号,则表示修改时间超过 n24 小时的文件;如果 n 前面有 - 符号,则表示修改时间在 n24 小时之内的文件。没有符号时,表示正好在 n24 小时前被修改的文件。 |
按最后被访问或读取的时间查找 | -atime | access time(访问时间),记录的是文件最后一次被访问或读取的时间。但现代Linux系统中,出于性能考虑,默认情况下不会实时更新atime,除非特别设置了相应的系统参数。 |
按文件元数据最后一次被改变的时间查找 | -ctime | change time(改变时间),记录的是文件元数据最后一次被改变的时间。这包括文件的属性、权限等的修改。在Linux中,ctime通常也会随着mtime的改变而改变,因为文件的元数据的改变通常伴随着文件内容的改变。 |
用于选择空目录 | -empty |
注意
- 在使用
size
选项时,#
代表具体的大小数值,前面可以加上+
或-
来表示大于或小于该数值。`` - 文件大小的单位(如kB, MB, GB)大小写敏感。
type
选项后的参数(如f, d, b, c)用于指定要查找的文件类型。maxdepth
和mindepth
选项用于控制搜索的目录深度,在递归搜索大型文件系统时非常有用。
-type 选项:
-type
选项在 find
命令中用于指定要查找的文件类型。-type
的具体形式:
类型 | 描述 |
---|---|
f | 普通文件 |
d | 目录 |
l | 符号链接(symbolic link) |
b | 块设备文件(block device) |
c | 字符设备文件(character device) |
p | 管道(pipe) |
s | 套接字(socket) |
D | 门户(door)(特定系统支持) |
find
常用选项拓展:
-user USERNAME #查找属主为指定用户(UID)的文件
-group GRPNAME #查找属组为指定组(GID)的文件
-uid UserlD #查找属主为指定的UID号的文件
-gid GroupID #查找属组为指定的GID号的文件
-nouser #查找没有属主的文件
-nogroup #查找没有属组的文件
-name"文件名称" #支持使用glob,如:*,?,[],[^],通配符要加双引号引起来
-inum n #按inode号查找
-links n#链接数为n的文件
格式示例:
查找当前目录及子目录下所有的普通文件
find . -type f
find /opt -name file*.txt -size -1G -user root
十、使用 find 命令实现多个查找条件
各表达式之间使用逻辑运算符
-a
表示 而且(and)
-o
表示 或者(or)
示例
find /boot -size +1024k -a -name "vmlinuz*"
find /boot -size +1024k -o -name "vmlinuz*"
示例
find /etc/-type f -o -size +50k -a -name *.ttb
解释:找寻【/etc/日录下,满足文件属性,】或者50k以上大小,以及以.ttb为结尾的任何对象
十一、文本统计工具-wc
统计文件内容有多少行
wc -l
wc命令介绍
wc(word count)命令是Linux系统中一个常用的文本统计工具,用于计算文件中的行数、单词数和字符数。它是文本处理中非常有用的工具,可以快速提供文件的基本统计信息。
基本语法
wc [选项] [文件名]
- 选项:是可选的参数,用于调整wc的输出格式。
- 文件名:是要统计的文件列表。如果未指定文件,wc将读取标准输入(stdin)。
常用选项
l
或-lines
:仅显示行数。(重点使用)c
或-bytes
:仅显示字节数。m
或-chars
:仅显示字符数(在多字节字符环境中使用)。在某些版本的wc中,m
和c
的行为可能相同,都表示字节数。但在支持多字节字符的环境中,m
会计算实际字符的数量。w
或-words
:仅显示字数。单词是以空格或制表符分隔的文本序列。L
或-max-line-length
:显示最长行的长度。
使用示例
-
统计文件的行数、单词数和字符数:
wc example.txt
输出结果将包括行数、单词数和字符数,如:
10 20 150 example.txt
,其中第一个数字表示行数,第二个数字表示单词数,第三个数字表示字符数。 -
仅统计行数:
wc -l example.txt
输出结果只包括文件的行数,如:
10 example.txt
。 -
仅统计单词数:
wc -w example.txt
输出结果只包括文件的单词数,如:
20 example.txt
。 -
仅统计字符数:
wc -m example.txt
在多字节字符环境中,输出文件的字符数。但在某些情况下,可能需要使用
-c
来获取字节数。 -
同时计算多个文件的统计信息并输出总计:
wc file1.txt file2.txt
分别显示两个文件的行数、单词数和字节数,以及这些文件的总和。
-
从标准输入中读取数据:
可以使用管道(|)操作符将其他命令的输出作为wc命令的输入,如:
cat example.txt | wc -l
计算example.txt文件的行数。
注意事项
- 在处理多字节字符(如中文、日文等)时,
m
选项会计算实际字符的数量,而c
或-bytes
选项则可能只计算字节数。 - wc命令还支持其他选项和用法,如递归统计目录下所有文件的信息(使用
r
选项,但并非所有版本的wc都支持),以及排除特定模式的文件或行(可能需要结合其他命令使用)。
十二、标准输入和标准输出
在Linux中,标准输入和标准输出是用于处理输入和输出数据的基本概念。
简单来说,我们在用户态输入什么内容提交给系统处理时就是什么内容,这个提交的过程就是标准输入
标准输入(stdin)
-
定义:系统默认的输入源,通常是键盘。
-
文件描述符:0
-
用途:读取用户输入。
-
示例:
cat
命令等待用户输入:
用户在键盘上输入的内容会被cat
命令读取并显示。cat
标准输出(stdout)
-
定义:系统默认的输出目标,通常是终端(屏幕)。
-
文件描述符:1
-
用途:输出数据到屏幕。
-
示例:
echo
命令输出文本:
该命令会将字符串"Hello, World!"显示在终端上。echo "Hello, World!"
重定向
-
标准输入重定向:使用
<
符号从文件读取输入。command < input.txt
-
标准输出重定向:使用
>
符号将输出写入文件。
十三、管道符 |
管道符(Pipeline):将一个命令的输出作为另一个命令的输入。
用竖线(|
)表示,将左侧命令的标准输出(stdout)作为右侧命令的标准输入(stdin)。可以将多个命令串联起来,拓展命令功能。
示例:
find /etc/-type f -o -size +50k -a -name *.ttb | wc -l
管道符的基本用法
命令1 | 命令2 | 命令3 ...
- 命令1 的输出会被传递给 命令2 作为其输入。
- 命令2 的输出(可能是对 命令1 输出的处理结果)接着被传递给 命令3,依此类推。
管道符的示例
-
查看文件内容并统计行数:
cat file.txt | wc -l
这里,
cat file.txt
命令的输出(即文件file.txt
的内容)被传递给wc -l
命令,后者计算并输出行数。 -
查找包含特定字符串的行并排序:
grep "hello" file.txt | sort
grep "hello" file.txt
命令查找文件file.txt
中包含 “hello” 字符串的所有行,并将这些行作为sort
命令的输入,sort
命令则对这些行进行排序。 -
文本处理的多步骤流程:
cat file.txt | grep "error" | sort | uniq -c
命令序列首先使用
cat
命令输出文件file.txt
的内容,然后通过grep "error"
筛选出包含 “error” 字符串的行,接着使用sort
对这些行进行排序,最后使用uniq -c
统计并输出每个唯一行(在这种情况下,由于已经排序,所以连续相同的行被视为唯一行)出现的次数。
管道符的注意事项
- 管道符连接的每个命令都是在子shell中执行的,它们之间不会共享变量(除非使用特殊的方法,如进程替换或命令替换)。
- 管道符右侧的命令必须能够处理来自左侧的输入。如果右侧的命令不接受标准输入(如某些仅显示帮助信息的命令),则管道可能不会按预期工作。
- 在使用管道时,需要注意命令的执行顺序和它们之间的依赖关系,以确保整个命令序列能够按预期运行。
十四、find之exec用法
find
命令与exec
结合使用可以更效率地查找并处理文件。find
命令用于遍历目录树,搜索符合特定条件的文件或目录,而exec
则在找到的每个文件或目录上执行指定的命令。
-exec
参数后面跟的是Linux命令,它是以分号“;”为结束标志,由于各个系统中分号会有不同的意义,因此在分号前面加上反斜杠转义符“\”。
格式
find path [options] -exec command {} \\;
解释
- path:要搜索的目录路径。
- options:查找条件,如文件名、类型、修改时间等。
- exec:指示
find
对每个匹配的文件或目录执行命令。 - command:要执行的命令。
- {}:占位符,表示当前找到的文件或目录。
- ;:表示命令结束(必须使用
\\
进行转义)。
示例1
find 命令匹配到了当前目录下的所有普通文件,并在 -exec 选项中使用 Is-命令将它们列出。
“{}” 代表前面find查找出来的文件名,
find ./ -type f -exec ls -{} \;
示例2
-
删除找到的文件:
find /path/to/search -type f -name "*.tmp" -exec rm {} \\;
查找指定目录下所有扩展名为
.tmp
的文件并删除它们。 -
修改找到文件的权限:
find /path/to/search -type f -name "*.sh" -exec chmod +x {} \\;
查找指定目录下所有扩展名为
.sh
的脚本文件并赋予可执行权限。 -
移动找到的文件:
find /path/to/search -type f -name "*.log" -exec mv {} /path/ \\;
查找指定目录下所有扩展名为
.log
的文件并移动到目标目录。 -
压缩找到的文件:
find /path/to/search -type f -name "*.txt" -exec gzip {} \\;
查找指定目录下所有扩展名为
.txt
的文件并使用gzip
压缩。 -
查找并执行多个命令:
find /path/to/search -type f -name "*.tmp" -exec sh -c 'echo "Processing {}"; rm {}' \\;
查找指定目录下所有扩展名为
.tmp
的文件,先打印文件名,再删除文件。
注意事项
-
性能问题:使用
exec
时,每找到一个文件或目录,find
都会启动一次新进程。如果处理大量文件,性能可能会受到影响。 -
替代方法:可以使用
+
代替\\;
,从而批量处理文件,提高效率:
这种方式会将所有匹配的文件一次性传递给rm
命令。find /path/to/search -type f -name "*.tmp" -exec rm {} +
注:图片来源于网络,侵删。