Linux 考试知识点详解(更易懂版本)
没有安装centos?没关系在线运行centos8(访问该网站不能使用网络代理):CentOS 8点击就用
1、创建文件,复制文件;注意复制的路径
- 学习重点命令:
touch,cp touch命令作用: 想象你有一个笔记本,touch命令就像是你在笔记本上新建了一个空白页,或者在已有的页面上更新了一下日期,表示你最近看过它。简单来说,它用于创建新的空文件,或者更新现有文件的“最后访问时间”和“最后修改时间”。touch命令详细参数与解释:不加任何参数:
touch my_document.txt这会在你当前所在的目录下创建一个名为
my_document.txt的空文件。如果这个文件已经存在,那么它会更新这个文件的“最后访问时间”和“最后修改时间”为你执行命令的那一刻。-a: 只修改文件的“最后访问时间”。就像你只是翻阅了笔记本的某一页,但没有在上面写任何东西。touch -a my_document.txt执行后,
my_document.txt的“最后访问时间”会被更新,但“最后修改时间”保持不变。-c或--no-create: 如果文件不存在,则不会创建它。就像你本来想在笔记本上写点东西,但发现笔记本不在身边,所以你什么也没做。touch -c non_existent_file.txt如果
non_existent_file.txt不存在,这条命令不会创建它,也不会报错。-d或--date=STRING: 使用你指定的日期和时间来设置文件的“最后访问时间”和“最后修改时间”。就像你在笔记本的某一页上写下了“我是在 X 年 X 月 X 日读到这里的”。touch -d "2023-10-26 15:00" old_document.txt这条命令会将
old_document.txt的时间设置为 2023 年 10 月 26 日下午 3 点。-m: 只修改文件的“最后修改时间”。就像你在笔记本的某一页上写了一些新的内容。touch -m my_document.txt执行后,
my_document.txt的“最后修改时间”会被更新,但“最后访问时间”保持不变。-r或--reference=FILE: 使用另一个文件的时间戳来设置目标文件的时间戳。就像你把两页笔记本的日期都改成了相同的日期。touch -r reference_file.txt target_file.txt这条命令会将
target_file.txt的时间设置得和reference_file.txt一样。-t STAMP: 使用[[CC]YY]MMDDhhmm[.ss]格式的时间戳来设置时间。这是一种更精确的指定时间的方式。touch -t 202310271030.50 my_log.txt这条命令会将
my_log.txt的时间设置为 2023 年 10 月 27 日上午 10 点 30 分 50 秒。
touch命令使用示例总结:- 创建单个空文件:
touch newfile.txt - 一次性创建多个空文件:
touch file1.txt file2.txt file3.txt - 更新文件的“最后访问时间”和“最后修改时间”为当前时间:
touch existingfile.txt
- 创建单个空文件:
cp命令作用:cp命令就像是复印机,它可以复制文件或整个文件夹。cp命令详细参数与解释:不加任何参数:
cp source.txt destination.txt这会将
source.txt复制一份,并命名为destination.txt,放在你当前所在的目录下。如果destination.txt已经存在,它会被覆盖。-a或--archive: 复制时保留所有信息,包括文件权限、时间戳等。就像复印的时候连纸张的质地和颜色都一起复制了。通常用于备份。cp -a /home/user/documents /backup/documents这会完整地复制
documents目录及其内容到/backup/目录下。-d或--no-dereference --preserve=links: 如果是复制链接文件(类似快捷方式),则复制链接本身,而不是链接指向的实际文件。cp -d symbolic_link.txt /backup/这条命令会复制
symbolic_link.txt这个链接文件本身,而不是它指向的文件。-f或--force: 如果目标文件已存在,强制覆盖,不提示。就像你复印的时候直接把原来的文件扔掉,换上新的。cp -f new_version.txt /data/old_version.txt即使
/data/old_version.txt已经存在,这条命令也会用new_version.txt直接覆盖它。-i或--interactive: 如果目标文件已存在,会提示你是否覆盖。就像你复印的时候会问你:“这里已经有一份了,要覆盖吗?”cp -i document.txt /backup/如果
/backup/document.txt存在,会提示你输入y(yes) 或n(no) 来决定是否覆盖。-l或--link: 不复制文件内容,而是创建一个硬链接。硬链接就像是同一个文件的多个名字,它们指向同一个数据块。cp -l original.txt link_to_original.txt修改
link_to_original.txt的内容,original.txt的内容也会改变,因为它们实际上是同一个文件。-p或--preserve[=ATTR_LIST]: 复制时保留指定的属性,例如文件权限、时间戳等。cp -p important.txt /backup/这条命令会尽可能地保留
important.txt的原有属性。-r或-R或--recursive: 递归复制,用于复制整个目录及其内容。就像你把整个文件夹,包括里面的所有文件和子文件夹都一起复制了。cp -r my_folder /backup/my_folder_backup这条命令会复制
my_folder目录及其所有内容到/backup/目录下。-s或--symbolic-link: 创建符号链接而不是复制文件。符号链接就像是快捷方式,指向另一个文件或目录。cp -s target_file.txt symbolic_link.txtsymbolic_link.txt会成为指向target_file.txt的快捷方式。-u或--update: 只有当源文件比目标文件新,或者目标文件不存在时,才进行复制。就像你只复印更新的版本。cp -u newer_file.txt /data/如果
/data/newer_file.txt不存在,或者newer_file.txt比它新,才会执行复制。-v或--verbose: 显示详细的复制过程,你会看到每个文件是如何被复制的。cp -rv my_folder /backup/这条命令会详细列出复制
my_folder目录时每个文件的复制情况。
cp命令使用示例总结:- 复制单个文件到当前目录并重命名:
cp source.txt destination.txt - 复制单个文件到指定目录:
cp source.txt /home/user/backup/ - 复制整个目录到当前目录并重命名:
cp -r sourcedir destdir - 复制整个目录到指定目录:
cp -r sourcedir /opt/
- 复制单个文件到当前目录并重命名:
注意事项:
- 路径问题至关重要! 复制时要搞清楚源文件和目标文件的位置。
- 绝对路径:从根目录
/开始的完整路径,像一棵树的主干,例如/home/user/document.txt。 - 相对路径:相对于你当前所在目录的路径,像树枝。例如,如果你在
/home/user/目录下,要访问documents目录下的file.txt,可以使用documents/file.txt。 - 覆盖风险:不加
-i参数时,如果目标路径已存在同名文件,cp命令会直接覆盖,像直接替换,所以要小心! - 复制目录时必须使用
-r或-R参数,告诉cp命令要递归复制整个目录树。
2、创建用户,用户组
- 学习重点命令:
useradd,passwd,groupadd,usermod,groupmod,userdel,groupdel useradd命令作用: 想象你的电脑是一个大房子,useradd命令就像是给这个房子添加一个新的房间,并给房间分配一个主人。简单来说,它用于创建新的用户账户。useradd命令详细参数与解释:不加任何参数:
sudo useradd newuser这会在系统中创建一个名为
newuser的新用户,但是这个用户没有设置密码,也没有家目录。家目录可以理解为用户自己的房间,用于存储自己的文件。-c COMMENT: 给用户添加注释信息,就像是给房间贴上标签,说明这个房间是做什么用的。sudo useradd -c "John Doe's Account" johndoe这条命令会创建一个名为
johndoe的用户,并添加注释信息 “John Doe’s Account”。-d HOME_DIR: 指定用户的主目录,也就是用户的“房间”的位置。sudo useradd -d /home/janedoe janedoe这条命令会创建一个名为
janedoe的用户,并将其主目录设置为/home/janedoe。-e EXPIRE_DATE: 设置用户的过期日期,就像是租房合同到期一样。日期格式为YYYY-MM-DD。sudo useradd -e 2024-12-31 tempuser这条命令会创建一个名为
tempuser的用户,该用户将在 2024 年 12 月 31 日过期。-g INITIAL_GROUP: 指定用户的初始组。组就像是家庭,初始组就是用户的主要家庭。组必须已经存在。sudo groupadd developers # 首先创建一个名为 developers 的组 sudo useradd -g developers devuser这条命令会创建一个名为
devuser的用户,并将其初始组设置为developers。-G GROUP1[,GROUP2,...]: 指定用户的附加组,也就是用户的其他家庭。组必须已经存在。sudo groupadd testers # 首先创建一个名为 testers 的组 sudo useradd -g developers -G testers devuser这条命令会将
devuser用户添加到testers组。-m或--create-home: 自动创建用户的主目录。这是最常用的选项,就像是给用户分配一个房间。sudo useradd -m testuser这条命令会创建一个名为
testuser的用户,并自动创建其主目录/home/testuser。-M或--no-create-home: 不创建用户的主目录。sudo useradd -M specialuser这条命令会创建一个名为
specialuser的用户,但不创建主目录。-p PASSWORD: 指定用户的加密密码。不建议直接在命令行中使用这个选项,因为这样不安全。 设置密码应该使用passwd命令。-s SHELL: 指定用户的默认 Shell。Shell 可以理解为用户和系统之间的翻译官。sudo useradd -s /bin/bash scriptuser这条命令会创建一个名为
scriptuser的用户,并将其默认 Shell 设置为/bin/bash。-u UID: 指定用户的 UID (用户ID),这是用户的唯一标识符,就像是身份证号码。sudo useradd -u 1001 newguy这条命令会创建一个名为
newguy的用户,并将其 UID 设置为 1001。
useradd命令使用示例总结:创建一个用户并自动创建主目录(常用):
sudo useradd -m testuser创建用户并指定主目录、初始组和附加组:
sudo useradd -d /opt/devhome -g developers -G testers devuser
passwd命令作用: 用于设置或更改用户的密码。就像是给用户的房间设置一把锁。passwd命令使用示例:设置当前用户的密码(如果是第一次设置,需要输入旧密码进行验证):
passwd设置指定用户的密码(需要
sudo权限):sudo passwd testuser系统会提示你输入两次新密码。
groupadd命令作用: 用于创建新的用户组。就像是建立一个新的家庭。groupadd命令详细参数与解释:不加任何参数:
sudo groupadd newgroup这会在系统中创建一个名为
newgroup的新组。-g GID: 指定组的 GID (组ID),这是组的唯一标识符,就像是家庭的门牌号。sudo groupadd -g 1005 testers这条命令会创建一个名为
testers的组,并将其 GID 设置为 1005。-r: 创建系统组。系统组的 GID 通常较小,用于系统服务。sudo groupadd -r systemgroup这条命令会创建一个名为
systemgroup的系统组。
groupadd命令使用示例总结:创建一个普通组:
sudo groupadd developers创建一个指定 GID 的组:
sudo groupadd -g 1005 testers
usermod命令作用: 用于修改已存在用户的属性。就像是修改用户的房间配置或者更改用户的家庭。usermod命令详细参数与解释:usermod的许多参数与useradd相同,只是它们用于修改现有用户,而不是创建新用户。-aG:将用户追加到某个组中。-a参数必须和-G参数配合使用,-a表示追加。sudo usermod -aG testers testuser这条命令会将
testuser用户添加到testers组,而不会影响testuser已经属于的其他组。-g:修改用户的初始组。sudo usermod -g newgroup testuser这条命令会将
testuser用户的初始组改为newgroup。-l:修改用户名。sudo usermod -l newuser olduser这条命令会将
olduser的用户名改为newuser。-d:修改用户的主目录。sudo usermod -d /home/newhome testuser这条命令会将
testuser用户的主目录改为/home/newhome。-m: 将家目录中内容移动到新位置. (只有在和-d一起时才会生效)sudo usermod -d /home/newhome testuser -m这条命令会将
testuser用户的主目录改为/home/newhome,并将家目录中内容移动到新位置。
usermod命令使用示例总结:将用户添加到某个组:
sudo usermod -aG testers testuser修改用户的初始组:
sudo usermod -g newgroup testuser修改用户名:
sudo usermod -l newuser testuser
groupmod命令作用: 用于修改已存在用户组的属性。就像是修改家庭的配置,例如改名或者换门牌号。groupmod命令详细参数与解释:-g GID: 修改组的 GID。sudo groupmod -g 1010 developers这条命令会将
developers组的 GID 修改为 1010。-n NEW_GROUP_NAME: 修改组的名称。sudo groupmod -n dev_team developers这条命令会将
developers组重命名为dev_team。
groupmod命令使用示例总结:修改组的 GID:
sudo groupmod -g 1010 developers修改组名:
sudo groupmod -n dev_team developers
userdel命令作用: 用于删除用户账户。就像是把用户的房间从房子里移除。userdel命令详细参数与解释:不加任何参数:
sudo userdel olduser这会从系统中删除名为
olduser的用户, 但是不会删除它的家目录。-r: 同时删除用户的主目录以及邮件池。就像是把用户的房间和所有物品都清理掉。sudo userdel -r olduser这条命令会删除
olduser用户及其主目录和邮件池。
userdel命令使用示例总结:删除用户,但不删除其主目录:
sudo userdel testuser删除用户并删除其主目录和邮件池:
sudo userdel -r olduser
groupdel命令作用: 用于删除用户组。就像是解散一个家庭。groupdel命令使用示例:- 删除用户组:
sudo groupdel oldgroup
- 删除用户组:
注意事项:
- 创建和管理用户及用户组通常需要管理员权限,因此需要使用
sudo命令,就像你需要房子的钥匙才能进行这些操作。 - 删除用户时,要考虑清楚是否需要删除用户的主目录。如果该用户的文件归属关系没有妥善处理,可能会导致文件权限问题,就像是房间被移除了,但里面的东西还在,不知道该归谁。
- 删除用户组前,需要确保该组没有任何用户,否则可能会导致用户账户异常,就像是一个家庭解散了,但还有人住在里面。
- 创建和管理用户及用户组通常需要管理员权限,因此需要使用
3、设置定时任务
- 学习重点命令:
crontab crontab命令作用:crontab就像一个智能闹钟,可以让你设置在特定的时间自动执行某些任务。crontab命令详细参数与解释:-e: 编辑当前用户的定时任务列表。就像是设置你的闹钟。crontab -e执行后,会打开一个文本编辑器(通常是
vi或nano),你可以在里面编辑你的定时任务。-l: 列出当前用户的定时任务列表。就像是查看你已经设置了哪些闹钟。crontab -l执行后,会显示你当前已有的定时任务。
-r: 删除当前用户的定时任务列表。就像是清空你的闹钟设置。crontab -r执行后,会删除你所有的定时任务。
-u user: 指定要操作哪个用户的定时任务列表(需要sudo权限)。就像是帮别人设置闹钟。sudo crontab -u otheruser -e这条命令会编辑
otheruser用户的定时任务列表。
crontab文件格式: 每一行代表一个定时任务,格式如下:minute hour day_of_month month day_of_week command这五个时间字段分别代表:
minute: 分钟 (0-59),表示每个小时的第几分钟执行。hour: 小时 (0-23),表示每天的几点钟执行(24 小时制)。day_of_month: 月份中的日期 (1-31),表示每个月的哪一天执行。month: 月份 (1-12 或 Jan-Dec),表示每年的哪个月执行。day_of_week: 星期几 (0-6 或 Sun-Sat,其中 0 和 7 都表示星期日),表示每周的星期几执行。command: 要执行的命令或脚本的完整路径。就像是闹钟响了之后要做的事情。
特殊字符:
*: 星号表示“任意”或“所有”。例如,hour字段设置为*表示每个小时都执行。,: 逗号用于分隔多个值。例如,minute字段设置为15,45表示每个小时的第 15 分钟和第 45 分钟都执行。-: 连字符表示一个范围。例如,day_of_month字段设置为1-5表示每个月的 1 号到 5 号都执行。/n: 斜杠表示每隔 n 个单位。例如,minute字段设置为*/10表示每隔 10 分钟执行一次。
crontab命令使用示例:编辑当前用户的定时任务列表:
crontab -e然后在打开的编辑器中添加定时任务,例如:
0 3 * * * /home/user/backup.sh这表示每天凌晨 3 点执行
/home/user/backup.sh这个脚本。30 4 1 * * /home/user/monthly_report.sh这表示每月1号凌晨4点30分执行
/home/user/monthly_report.sh这个脚本。0 0 * * 0 /home/user/weekly_report.sh这表示每周日凌晨0点执行
/home/user/weekly_report.sh这个脚本。*/5 * * * * /home/user/check_status.sh这表示每5分钟执行一次
/home/user/check_status.sh这个脚本。
保存并退出编辑器,定时任务就会生效。列出当前用户的定时任务列表:
crontab -l删除当前用户的定时任务列表:
crontab -r
注意事项:
- 编辑定时任务时,要确保命令或脚本的路径正确,并且该脚本有执行权限 (可以使用
chmod +x script.sh添加执行权限)。 定时任务的执行结果通常会通过邮件发送给用户。如果你不需要邮件通知,可以将输出重定向到
/dev/null,例如:0 3 * * * /home/user/backup.sh >/dev/null 2>&1>/dev/null表示将标准输出重定向到空设备,2>&1表示将标准错误输出也重定向到标准输出。- 你可以查看系统日志(例如
/var/log/syslog或/var/log/cron)来确认定时任务是否按预期执行。 - 除了用户级别的定时任务,还有系统级别的定时任务,通常配置在
/etc/crontab文件中,需要sudo权限进行编辑。/etc/crontab文件中每行定时任务配置的第六个位置可以指定执行定时任务的用户。
- 编辑定时任务时,要确保命令或脚本的路径正确,并且该脚本有执行权限 (可以使用
4、文件内容的替换,sed命令
- 学习重点命令:
sed sed命令作用:sed是一个强大的“流编辑器”,它可以对文本进行各种操作,比如查找、替换、删除、插入等等。你可以把它想象成一个文本加工厂,可以按照你的指令对文本进行批量处理。sed命令详细参数与解释:-e script或--expression=script: 添加一个sed命令到要执行的命令列表中。你可以使用多个-e选项来执行多个命令。sed -e 's/apple/orange/g' -e 's/banana/grape/g' fruits.txt这条命令会将
fruits.txt文件中所有的 “apple” 替换为 “orange”,所有的 “banana” 替换为 “grape”。-f script-file或--file=script-file: 从文件中读取sed命令。这在你有很多命令需要执行时很有用。# 首先创建一个包含 sed 命令的文件 commands.sed: # s/apple/orange/g # s/banana/grape/g sed -f commands.sed fruits.txt这条命令会执行
commands.sed文件中的所有sed命令。-i[SUFFIX]或--in-place[=SUFFIX]: 直接修改文件内容。使用这个选项要特别小心,因为它会直接修改原始文件! 建议先备份文件。如果提供SUFFIX,则会先备份原始文件,例如.bak。sed -i 's/red/blue/g' colors.txt这条命令会直接修改
colors.txt文件,将所有的 “red” 替换为 “blue”。sed -i.bak 's/red/blue/g' colors.txt这条命令会先将
colors.txt备份为colors.txt.bak,然后再进行替换操作。-n或--quiet或--silent: 取消默认输出。sed默认会输出每一行,不管它是否被修改过。使用-n选项可以只输出那些被修改过的行。sed -n 's/hello/world/p' greetings.txt这条命令只输出那些 “hello” 被替换为 “world” 的行。
p命令表示打印匹配的行。-r或--regexp-extended: 使用扩展的正则表达式。扩展的正则表达式支持更多的元字符,例如+,?,|,(),{}。sed -r 's/colou?r/color/g' text.txt这条命令会将 “color” 和 “colour” 都替换为 “color”。
?表示前面的字符u是可选的。
sed命令常用命令:s/pattern/replacement/flags: 替换命令,这是sed最常用的命令。s:表示替换 (substitute)。pattern:要查找的模式,可以是普通文本或正则表达式。replacement:替换后的文本。flags:标志,可以修改替换行为。g:全局替换,替换所有匹配项,而不是只替换第一个。i:忽略大小写。N:替换第 N 次匹配项。例如,s/a/b/2会将每行中第二个出现的 “a” 替换为 “b”。
sed 's/apple/orange/g' fruits.txt # 全局替换 sed 's/Apple/Orange/i' fruits.txt # 忽略大小写替换 sed 's/the/THE/2' text.txt # 只替换每行中第二个出现的 "the"d: 删除匹配到的行。sed '/^#/d' config.txt # 删除以 "#" 开头的行(通常是注释) sed '5,10d' data.txt # 删除第 5 行到第 10 行 sed '$d' file.txt # 删除最后一行p: 打印匹配到的行(通常与-n选项一起使用)。sed -n '/error/p' log.txt # 只打印包含 "error" 的行a\: 在匹配到的行之后添加新行。sed '/total/a\---' report.txt # 在包含 "total" 的行之后添加一行 "---"i\: 在匹配到的行之前添加新行。sed '/header/i\***' document.txt # 在包含 "header" 的行之前添加一行 "***"c\: 将匹配到的行替换为新行。sed '/old data/c\new data' file.txt # 将包含 "old data" 的行替换为 "new data"
sed命令使用示例总结:将文件中所有的 “old” 替换为 “new” 并输出到终端:
sed 's/old/new/g' file.txt直接修改文件,将所有的 “old” 替换为 “new”:
sed -i 's/old/new/g' file.txt备份文件,然后将所有的 “old” 替换为 “new”:
sed -i.bak 's/old/new/g' file.txt只打印包含 “error” 的行:
sed -n '/error/p' file.txt删除包含 “warning” 的行:
sed '/warning/d' file.txt在包含 “info” 的行之后添加一行 “—- End of Info —-“:
sed '/info/a\--- End of Info ---' file.txt替换每一行的第一个“foo”为“bar”
sed 's/foo/bar/' file.txt替换每一行的第3个到最后所有的“foo”为“bar”
sed 's/foo/bar/3g' file.txt
注意事项:
- 使用
-i选项直接修改文件内容时要格外小心,最好先备份文件,就像做手术前要先做检查。 - 正则表达式在
sed命令中非常强大,但学习起来也比较复杂。 sed默认使用/作为分隔符,但如果模式中包含/,可以使用其他字符作为分隔符,例如s#old#new#g,这里使用#作为分隔符。- 可以结合多个简单的sed命令来完成复杂的编辑任务。例如,要删除文件中的所有空行,并将所有“apple”替换为“orange”,可以使用:
sed '/^$/d; s/apple/orange/g' file.txt。其中/^$/d删除空行,s/apple/orange/g替换文本。两个命令之间使用分号分隔。
- 使用
5、查找文件并删除,find命令
- 学习重点命令:
find find命令作用:find命令就像一个超级侦探,可以在你的文件系统中找到符合你指定条件的文件或目录。find命令详细参数与解释:path...: 指定要查找的目录路径。可以指定多个路径,find会在这些路径下进行查找。如果不指定路径,则默认在当前目录下查找。find /home /var/log # 在 /home 和 /var/log 目录下查找 find . # 在当前目录下查找 find # 不指定路径,也是在当前目录下查找-name pattern: 按文件名查找,支持通配符 (*,?,[])。find / -name "*.txt" # 查找所有以 .txt 结尾的文件 find . -name "report?.doc" # 查找 report 开头,后面跟一个任意字符,以 .doc 结尾的文件,例如 report1.doc, reportA.doc find . -name "[abc]*" # 查找以 a, b 或 c 开头的文件-iname pattern: 按文件名查找,忽略大小写。find . -iname "readme.md" # 查找 readme.md, ReadMe.MD, README.md 等文件,不区分大小写-type c: 按文件类型查找。c可以是以下几种:f:普通文件 (regular file)。d:目录 (directory)。l:符号链接 (symbolic link)。b:块设备文件 (block special file)。c:字符设备文件 (character special file)。p:命名管道 (FIFO)。s:套接字 (socket)。
find /tmp -type f # 查找 /tmp 目录下所有的普通文件 find . -type d # 查找当前目录下所有的子目录 find / -type l -name "lib*" # 查找 / 目录下所有以 "lib" 开头的符号链接-size n[ckMG]: 按文件大小查找。n是数字,单位可以是:c:字节 (bytes)。k:KB (kilobytes)。M:MB (megabytes)。G:GB (gigabytes)。- 可以使用
+表示大于,-表示小于,不加符号表示等于。
find . -size +10M # 查找当前目录下大于 10MB 的文件 find / -size -1k # 查找根目录下小于 1KB 的文件 find . -size 50c # 查找当前目录下大小为 50 字节的文件-user username: 按文件所有者查找。find /home -user alice # 查找 /home 目录下所有者为 alice 的文件-group groupname: 按文件所属组查找。find /data -group developers # 查找 /data 目录下所属组为 developers 的文件-mtime n: 按文件修改时间 (modification time) 查找,n是天数。+n:n 天前被修改过。-n:n 天内被修改过。n:正好在 n 天前被修改过。
find . -mtime -7 # 查找当前目录下 7 天内被修改过的文件 find / -mtime +30 # 查找根目录下 30 天前被修改过的文件 find . -mtime 1 #查找1天前那天修改的文件-atime n: 按文件访问时间 (access time) 查找,用法同-mtime。find . -atime -1 # 查找当前目录下 1 天内被访问过的文件-ctime n: 按文件状态更改时间 (change time) 查找,用法同-mtime。文件状态更改包括文件权限、所有者、所属组的变化,也包括文件内容的修改。find / -ctime +90 # 查找根目录下 90 天前状态被更改过的文件-exec command {} \;: 对找到的文件执行指定的命令。{}:表示找到的文件名。\;:表示命令结束。
find . -name "*.tmp" -exec rm {} \; # 查找当前目录下所有以 .tmp 结尾的文件并删除它们 find /data -type f -size +100M -exec ls -lh {} \; # 查找 /data 目录下大于 100MB 的文件并列出它们的详细信息-delete: 删除找到的文件或目录。使用这个选项要非常小心,因为它会直接删除文件,且不可恢复!find . -name "*~" -delete # 查找当前目录下所有以 "~" 结尾的文件并删除它们(很多编辑器会生成这种临时备份文件)-print: 打印找到的文件名。这是find命令的默认行为,所以通常不需要显式指定。find . -name "*.txt" -print # 查找当前目录下所有以 .txt 结尾的文件并打印它们的文件名
find命令使用示例总结:在当前目录下查找所有以
.txt结尾的文件:find . -name "*.txt"在
/home目录下查找所有名为important.conf的文件:find /home -name "important.conf"在
/var/log目录下查找所有大于 1MB 的日志文件:find /var/log -type f -size +1M在当前目录下查找所有属于用户
testuser的文件:find . -user testuser在当前目录下查找所有 7 天前被修改过的文件并删除它们:
find . -mtime +7 -delete在当前目录下查找所有以
.log结尾的文件,并将它们移动到/tmp/logs/目录:find . -name "*.log" -exec mv {} /tmp/logs/ \;
如果
/tmp/logs目录不存在,需要先创建:mkdir -p /tmp/logs。-p参数表示连同上级目录一起创建。注意事项:
- 使用
-delete参数删除文件时务必小心,删除操作不可逆,就像泼出去的水收不回来。建议先使用-print确认要删除的文件,确保无误后再使用-delete。 -exec参数可以执行任何命令,需要注意安全性,防止误操作或被恶意利用。- 通配符在不同的上下文中含义可能不同,在
find -name中,需要用引号括起来以避免 shell 解释。例如,find . -name *.txt会查找以.txt结尾的文件,但find . -name *由于没有引号,shell 可能会先展开*,导致结果不符合预期。 find命令默认是递归查找,如果不想递归查找,可以使用-maxdepth参数指定最大深度。例如:find . -maxdepth 1 -name "*.txt"表示只在当前目录下查找,不进入子目录。
- 使用
6、文件权限,chmod,chown
- 学习重点命令:
chmod,chown chmod命令作用:chmod用于修改文件或目录的权限。在 Linux 中,每个文件和目录都有三组权限:所有者 (user)、所属组 (group) 和其他用户 (others)。每组权限又分为三种:读 (read)、写 (write) 和执行 (execute)。就像是给你的文件或目录设置不同的访问密码。chmod命令权限表示:对象:
u:所有者 (user)。g:所属组 (group)。o:其他用户 (others)。a:所有用户 (all),相当于ugo。
操作:
+:添加权限。-:移除权限。=:设置权限。
权限:
r:读权限 (read),可以查看文件内容或列出目录中的文件。w:写权限 (write),可以修改文件内容或在目录中创建、删除文件。x:执行权限 (execute),可以运行可执行文件或进入目录。
chmod命令数字模式: 除了使用字母表示权限,还可以使用数字来表示。r:4w:2x:1
将用户、组和其他用户的权限值相加得到一个三位数字。例如:
755:u=rwx(4+2+1=7),g=rx(4+1=5),o=rx(4+1=5)。表示所有者有读、写、执行权限,所属组和其他用户有读和执行权限。644:u=rw(4+2=6),g=r(4),o=r(4)。表示所有者有读、写权限,所属组和其他用户只有读权限。600:u=rw(4+2=6),g=---(0),o=---(0)。表示只有所有者有读、写权限,其他用户没有任何权限。
chmod命令详细参数与解释:-R或--recursive: 递归修改目录及其所有内容的权限。chmod -R 755 my_folder这条命令会递归地将
my_folder目录及其所有子目录和文件的权限设置为755。--reference=RFILE: 使用参考文件RFILE的权限来设置目标文件的权限。chmod --reference=template.txt new_file.txt这条命令会将
new_file.txt的权限设置得和template.txt一样。-v或--verbose: 显示详细的权限修改信息。chmod -v u+x script.sh这条命令会显示
script.sh的权限修改过程。
chmod命令使用示例:给文件
script.sh的所有者添加执行权限:chmod u+x script.sh移除文件
data.txt所属组的写权限:chmod g-w data.txt设置目录
myfolder的权限为所有者读写执行,所属组读执行,其他用户只读:chmod 754 myfolder递归设置目录
webroot及其所有内容的权限为所有者读写执行,所属组读执行,其他用户只读:chmod -R 755 webroot设置文件
data.txt权限为-rw-r--r--:chmod 644 data.txt设置文件
script.sh权限为-rwxr--r--:chmod 744 script.sh
chown命令作用:chown用于修改文件或目录的所有者和所属组。就像是更改房子的主人和所属的家庭。chown命令详细参数与解释:-R或--recursive: 递归修改目录及其所有内容的所有者和所属组。sudo chown -R newuser:newgroup my_folder这条命令会递归地将
my_folder目录及其所有子目录和文件的所有者改为newuser,所属组改为newgroup。--from=CURRENT_OWNER:CURRENT_GROUP: 仅当文件的当前所有者和所属组匹配时才进行修改。sudo chown --from=olduser:oldgroup newuser:newgroup file.txt只有当
file.txt的当前所有者是olduser且当前所属组是oldgroup时,这条命令才会将文件的所有者改为newuser,所属组改为newgroup。--reference=RFILE: 使用参考文件RFILE的所有者和所属组来设置目标文件的所有者和所属组。sudo chown --reference=template.txt new_file.txt这条命令会将
new_file.txt的所有者和所属组设置得和template.txt一样。-v或--verbose: 显示详细的修改信息。sudo chown -v newuser file.txt这条命令会显示
file.txt的所有者修改过程。
chown命令使用示例:将文件
myfile.txt的所有者修改为newuser:sudo chown newuser myfile.txt将文件
myfile.txt的所有者修改为newuser,所属组修改为newgroup:sudo chown newuser:newgroup myfile.txt- 仅修改文件所属组:
sudo chown :newgroup myfile.txt- 递归将目录
mydir及其所有内容的所有者修改为webadmin,所属组修改为www-data:sudo chown -R webadmin:www-data mydir
注意事项:
- 修改文件权限和所有者通常需要管理员权限,因此需要使用
sudo命令,就像你需要房子的钥匙才能更改房子的主人。 - 递归修改权限和所有者时要格外小心,确保操作符合预期,不要误操作导致系统出现问题。
- 理解 Linux 的用户、组和权限模型是正确使用
chmod和chown的基础。每个文件和目录都有所有者、所属组和其他用户的概念,以及读、写、执行三种权限。
- 修改文件权限和所有者通常需要管理员权限,因此需要使用
7、ACL权限,默认ACL,递归设置
- 学习重点命令:
setfacl,getfacl - ACL (Access Control List) 权限作用: ACL 权限是对基本的文件权限 (所有者、所属组、其他用户) 的补充,提供了更细粒度的权限控制。可以为特定用户或组设置特定的权限,而不受限于基本权限的设置。就像是在房间的主锁之外,又加了几把针对特定人员的锁。
getfacl命令作用: 用于查看文件或目录的 ACL 权限。就像是查看门上都装了哪些锁。getfacl命令使用示例:查看文件
myfile.txt的 ACL 权限:getfacl myfile.txt输出可能类似于:
# file: myfile.txt # owner: user1 # group: group1 user::rw- group::r-- other::r--如果设置了acl, 则会输出类似如下信息:
# file: myfile.txt # owner: user1 # group: group1 user::rw- user:user2:r-- group::r-- mask::r-- other::r--
setfacl命令作用: 用于设置文件或目录的 ACL 权限。就像是给门加装新的锁。setfacl命令常用参数:-m或--modify: 修改文件或目录的 ACL 条目。这是最常用的选项。sudo setfacl -m u:alice:rw myfile.txt这条命令会给用户
alice添加对myfile.txt文件的读写权限。-x或--remove: 删除文件或目录的 ACL 条目。sudo setfacl -x u:alice myfile.txt这条命令会删除用户
alice对myfile.txt文件的 ACL 权限。-b或--remove-all: 删除文件或目录的所有 ACL 条目。sudo setfacl -b myfile.txt这条命令会删除
myfile.txt文件的所有 ACL 条目,恢复到只有基本权限的状态。-d或--default: 设置目录的默认 ACL。默认 ACL 只对目录有效,表示以后在该目录下新创建的文件或子目录将继承这些 ACL。sudo setfacl -d -m u:bob:rx myfolder这条命令会设置
myfolder目录的默认 ACL,使得以后在myfolder中创建的文件,用户bob都会有读和执行权限。-R或--recursive: 递归设置目录及其所有内容的 ACL。sudo setfacl -R -m u:datauser:r datadir这条命令会递归地给
datadir目录及其所有子目录和文件设置 ACL,使得用户datauser对它们都有读权限。
setfacl命令 ACL 条目格式:u:username:permissions: 为指定用户设置权限。g:groupname:permissions: 为指定组设置权限。m:permissions: 设置有效权限掩码 (mask)。掩码用于限制授予的权限。例如,如果掩码是r--,即使你给某个用户设置了rw权限,该用户实际上也只有读权限。
setfacl命令使用示例:为用户
alice设置文件myfile.txt的读写权限:sudo setfacl -m u:alice:rw myfile.txt为组
developers设置文件myfile.txt的读权限:sudo setfacl -m g:developers:r myfile.txt删除用户
alice对文件myfile.txt的 ACL 权限:sudo setfacl -x u:alice myfile.txt设置目录
myfolder的默认 ACL,使得新创建的文件对用户bob拥有读写权限:sudo setfacl -d -m u:bob:rw myfolder递归设置目录
datadir及其所有内容的 ACL,为用户datauser设置读权限:sudo setfacl -R -m u:datauser:r datadir为组
developers设置目录/project的默认访问权限为rwx:sudo setfacl -d -m g:developers:rwx /project
注意事项:
- 操作 ACL 权限通常需要管理员权限,因此需要使用
sudo命令。 - 默认 ACL 只对目录有效,对目录中已经存在的文件或子目录无效。
- ACL 权限会覆盖基本的文件权限。例如,如果你通过 ACL 给某个用户设置了对文件的读权限,即使该文件对其他用户的权限是
---(没有任何权限),该用户仍然可以读取文件。 - 可以使用
getfacl命令来验证 ACL 设置是否生效。 - 设置了acl的文件或目录,使用
ls -l查看权限的时候,最后会多一个+号。
- 操作 ACL 权限通常需要管理员权限,因此需要使用
8、逻辑卷设置;pvcreate, vgcreate, lvcreate
- 学习重点命令:
pvcreate,vgcreate,lvcreate,pvs,vgs,lvs,lvextend,resize2fs,lvreduce - 逻辑卷管理 (LVM) 作用: LVM 是一种更高级的磁盘管理方式,它允许你将多个物理磁盘或分区组合成一个逻辑卷组 (VG),然后在 VG 中创建逻辑卷 (LV)。LV 可以像普通分区一样被格式化和挂载,但 LVM 的优势在于它可以动态调整 LV 的大小,创建快照等,而不需要重新分区。就像是把几块积木 (物理磁盘) 拼成一个大盒子 (卷组),然后你可以在盒子里自由分隔出不同大小的隔间 (逻辑卷)。
pvcreate命令作用: 用于将物理磁盘分区或整个磁盘初始化为物理卷 (PV)。这是 LVM 的第一步,就像是把积木块标记为可以用来搭建盒子的积木。pvcreate命令使用示例:- 将
/dev/sdb1和/dev/sdc1这两个分区初始化为 PV:sudo pvcreate /dev/sdb1 /dev/sdc1 - 将一整块磁盘
/dev/sdd初始化为物理卷:sudo pvcreate /dev/sdd
- 将
vgcreate命令作用: 用于创建一个卷组 (VG),将多个 PV 组合在一起。就像是用标记好的积木搭建一个大盒子。vgcreate命令使用示例:- 使用
/dev/sdb1和/dev/sdc1这两个 PV 创建一个名为myvg的 VG:sudo vgcreate myvg /dev/sdb1 /dev/sdc1 - 创建一个名为
datavg, 使用物理卷/dev/sdd的卷组:sudo vgcreate datavg /dev/sdd
- 使用
lvcreate命令作用: 用于在 VG 中创建逻辑卷 (LV)。就像是在盒子里分隔出一个个隔间。lvcreate命令常用参数:-L size: 指定 LV 的大小。可以使用K,M,G,T等单位。-n name: 指定 LV 的名称。-l num: 按PE数量进行分配, 通常pe大小为4MB。
lvcreate命令使用示例:- 在
myvg这个 VG 中创建一个名为mylv,大小为 5GB 的 LV:sudo lvcreate -L 5G -n mylv myvg - 在
myvg这个 VG 中创建一个名为homelv,大小为 500MB 的 LV:sudo lvcreate -L 500M -n homelv myvg - 从卷组
datavg创建大小为150个PE的逻辑卷datalv:sudo lvcreate -l 150 -n datalv datavg
- 在
pvs,vgs,lvs命令作用: 分别用于显示 PV、VG 和 LV 的信息。就像是查看积木、盒子和隔间的状态。pvs,vgs,lvs命令使用示例:- 显示所有 PV 的信息:
pvs - 显示所有 VG 的信息:
vgs - 显示所有 LV 的信息:
lvs
- 显示所有 PV 的信息:
lvextend命令作用: 用于扩展 LV 的大小。就像是把隔间的空间扩大。resize2fs命令作用: 用于调整文件系统的大小以匹配 LV 的大小。注意:resize2fs只适用于 ext2/3/4 文件系统。对于 XFS 文件系统,需要使用xfs_growfs命令。 就像是把隔间里的东西重新摆放,以适应更大的空间。lvextend和resize2fs命令使用示例:- 将
mylv这个 LV 的大小增加 2GB:sudo lvextend -L +2G /dev/myvg/mylv - 然后,调整文件系统的大小以适应新的 LV 大小(假设
mylv上使用的是 ext4 文件系统):sudo resize2fs /dev/myvg/mylv - 使用xfs文件系统将
homelv增加500M并同步文件系统:sudo lvextend -L +500M /dev/myvg/homelv sudo xfs_growfs /dev/myvg/homelv
- 将
lvreduce命令作用: 用于缩小 LV 的大小。注意:缩小 LV 之前,需要先卸载文件系统,并确保文件系统上有足够的空闲空间。缩小 LV 是一个有风险的操作,可能会导致数据丢失,务必小心! 就像是把隔间的空间缩小,需要先把里面的东西移走一部分。lvreduce命令使用示例:- 缩小前需要先卸载逻辑卷:
sudo umount /dev/myvg/datalv - 检查文件系统:
sudo e2fsck -f /dev/myvg/datalv - 调整文件系统大小:
sudo resize2fs /dev/myvg/datalv 100M - 缩小逻辑卷:
sudo lvreduce -L 100M /dev/myvg/datalv - 再次挂载文件系统:
sudo mount /dev/myvg/datalv /mnt
- 缩小前需要先卸载逻辑卷:
注意事项:
- LVM 操作通常需要管理员权限,因此需要使用
sudo命令。 - 在创建 LV 之后,需要使用
mkfs命令格式化文件系统,然后才能挂载使用。例如:sudo mkfs.ext4 /dev/myvg/mylv # 格式化为 ext4 文件系统 sudo mount /dev/myvg/mylv /mnt # 挂载到 /mnt 目录 - 扩展 LV 后,需要使用
resize2fs(ext 文件系统) 或xfs_growfs(XFS 文件系统) 命令来同步文件系统的大小,否则文件系统无法使用新增加的空间。 - 缩小 LV 之前,一定要确保文件系统有足够的空闲空间,并且已经卸载。建议先备份数据,以防万一。
- LVM 操作通常需要管理员权限,因此需要使用
9、磁盘与分区的设备文件名。
磁盘设备文件名: 在 Linux 中,每个磁盘都被表示为一个设备文件,就像是给每个磁盘起了一个名字。这些设备文件通常位于
/dev目录下。SATA/SCSI 硬盘: 通常以
/dev/sd开头,后面跟着一个字母表示磁盘的顺序 (a, b, c…)。例如:/dev/sda:第一块 SATA 或 SCSI 硬盘。/dev/sdb:第二块 SATA 或 SCSI 硬盘。/dev/sdc:第三块 SATA 或 SCSI 硬盘。
NVMe 固态硬盘: 通常以
/dev/nvme开头,后面跟着数字表示控制器序号,再跟着n和一个数字表示命名空间,最后是p和数字表示分区号。例如:/dev/nvme0n1:第一块 NVMe 硬盘的第一个命名空间。/dev/nvme1n1:第二块 NVMe 硬盘的第一个命名空间。
- 较旧的 IDE 硬盘: 较旧的 IDE 硬盘通常以
/dev/hd开头,例如/dev/hda,/dev/hdb等。现在已经很少见了。
分区设备文件名: 分区是在磁盘上划分出来的逻辑区域,每个分区也有一个设备文件名。分区设备文件名是在磁盘设备文件名后面加上数字表示分区号。
主分区和扩展分区: 分区号从 1 开始。例如:
/dev/sda1:/dev/sda硬盘的第一个分区。/dev/sdb2:/dev/sdb硬盘的第二个分区。
逻辑分区: 分区号通常从 5 开始。例如:
/dev/sda5:/dev/sda硬盘的第一个逻辑分区。/dev/sdb6:/dev/sdb硬盘的第二个逻辑分区。
NVMe 硬盘分区示例:
/dev/nvme0n1p1:/dev/nvme0n1硬盘的第一个分区。/dev/nvme0n1p2:/dev/nvme0n1硬盘的第二个分区。
如何查看磁盘与分区信息:
lsblk命令: 以树状结构显示块设备(磁盘和分区)的信息,非常直观易用。lsblk输出示例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 2G 0 part /boot ├─sda2 8:2 0 5G 0 part │ └─myvg-mylv 253:0 0 3G 0 lvm /mnt └─sda3 8:3 0 10G 0 part /home sdb 8:16 0 10G 0 disk └─sdb1 8:17 0 10G 0 part └─myvg-mylv 253:0 0 3G 0 lvm /mnt nvme0n1 259:0 0 50G 0 disk └─nvme0n1p1 259:1 0 50G 0 part /datafdisk -l命令: 列出所有磁盘和分区的信息。需要sudo权限。sudo fdisk -lparted -l命令: 显示磁盘分区表的详细信息。需要sudo权限。sudo parted -ldf -h命令: 显示文件系统的磁盘空间使用情况,可以间接看到已挂载的分区。df -h
注意事项:
- 设备文件名是操作系统识别和访问磁盘与分区的基础,就像是磁盘和分区的身份证号码。
- 操作磁盘和分区(例如格式化、分区、挂载)时,必须正确指定设备文件名,否则可能导致数据丢失或其他严重问题,就像是填错身份证号码会导致很多麻烦。
- 新型 NVMe 硬盘的命名方式与传统的 SATA/SCSI 硬盘有所不同,需要注意区分。
10、sudo授权规则
- 学习重点文件:
/etc/sudoers sudo命令作用:sudo允许普通用户以另一个用户的身份(通常是 root 用户,即超级管理员)执行命令。就像是获得了一张临时的通行证,可以去做一些平时没有权限做的事情。/etc/sudoers文件作用:/etc/sudoers文件定义了哪些用户或组可以执行哪些命令,以及是否需要输入密码。它是sudo命令的规则手册。强烈建议不要直接编辑此文件,而是使用visudo命令。visudo命令作用:visudo是一个专门用来编辑/etc/sudoers文件的编辑器,它会在保存时进行语法检查,防止因为配置错误导致系统无法正常使用sudo。就像是一个专业的安全编辑工具,可以避免你犯错。sudoers文件语法:基本格式:
用户名 主机名= (运行身份) 命令用户名:允许使用sudo的用户名,或者%组名表示用户组。主机名:允许在该主机上使用sudo。通常使用ALL表示所有主机。运行身份:以哪个用户的身份运行命令。通常使用ALL表示任意用户,或root表示超级管理员。命令:允许执行的命令。可以使用绝对路径,例如/usr/bin/ls,或使用ALL表示所有命令。
- 免密码授权: 在命令部分添加
NOPASSWD:前缀可以免除输入密码。
visudo命令使用示例:sudo visudo
执行后,会打开 /etc/sudoers 文件(通常使用 vi 或 nano 编辑器)。
常见配置示例:
允许用户
alice在所有主机上以任意用户身份执行所有命令(非常危险,不推荐!):alice ALL=(ALL) ALL允许用户
bob在当前主机上以root身份运行/sbin/reboot命令,无需输入密码:bob localhost=(root) NOPASSWD: /sbin/reboot允许属于
admin组的用户在所有主机上以root身份运行/usr/bin/apt update和/usr/bin/apt upgrade命令:%admin ALL=(root) /usr/bin/apt update, /usr/bin/apt upgrade允许用户
tom在所有主机上以root身份执行/usr/bin/vim命令:tom ALL=(root) /usr/bin/vim注意事项:
/etc/sudoers文件的配置非常重要,错误的配置可能导致安全风险,甚至导致系统无法使用sudo。- 强烈建议使用
visudo命令来编辑/etc/sudoers文件,而不是直接用其他编辑器编辑。 - 应该尽可能限制用户可以执行的
sudo命令,避免授予过多的权限,就像是通行证上的权限要写清楚,不能什么地方都能去。 - 免密码授权需要谨慎使用,特别是对于具有高危操作的命令
11、shell编程,批量解压缩
- Shell 编程基础: Shell 既是一个命令解释器(解释你输入的命令),也是一种编程语言。你可以编写 Shell 脚本来自动化执行一系列命令,就像是写一个剧本,让计算机按照剧本的步骤去执行任务。
批量解压缩的常用命令:
tar命令:tar命令是一个强大的归档工具,它可以将多个文件或目录打包成一个文件(归档),也可以将归档文件解包。tar还可以调用压缩工具 (如gzip,bzip2,xz) 来压缩或解压缩归档文件。解压
.tar文件: 不使用任何压缩。tar -xf archive.tarx表示解包 (extract),f表示指定文件名 (file)。解压
.tar.gz或.tgz文件: 使用gzip压缩。tar -xzf archive.tar.gzz表示使用gzip解压。解压
.tar.bz2文件: 使用bzip2压缩。tar -xjvf archive.tar.bz2j表示使用bzip2解压。v参数显示详细信息。解压
.tar.xz文件: 使用xz压缩。tar -xJvf archive.tar.xzJ表示使用xz解压。参数解释:
-x:解包 (extract)。-z:使用gzip解压。-j:使用bzip2解压。-J:使用xz解压。-v:显示详细过程 (verbose)。如果不加-v,则不会显示解压的文件列表。-f 文件名:指定要操作的归档文件名。-C 目录:指定解压到的目录。如果不指定,则解压到当前目录。tar -xzf archive.tar.gz -C /tmp/extracted_files这条命令会将
archive.tar.gz解压到/tmp/extracted_files目录。
创建压缩包
创建
.tar格式的包:tar -cvf archive.tar file1 file2 dir1-c表示创建。创建
.tar.gz格式的包:tar -czvf archive.tar.gz file1 file2 dir1创建
.tar.bz2格式的包:tar -cjvf archive.tar.bz2 file1 file2 dir1
unzip命令:unzip命令用于解压.zip文件。解压
.zip文件:unzip archive.zip参数解释:
-d 目录:指定解压到的目录。unzip archive.zip -d /tmp/extracted_files这条命令会将
archive.zip解压到/tmp/extracted_files目录。-l: 只查看压缩包中文件列表,不解压。unzip -l archive.zip
Shell 脚本实现批量解压缩:
#!/bin/bash # 指定要解压的文件类型 file_extensions=("tar.gz" "tar.bz2" "tar.xz" "zip") # 遍历当前目录下的所有文件 for file in *; do # 获取文件名 filename=$(basename "$file") # 遍历文件类型 for ext in "${file_extensions[@]}"; do # 判断文件是否以指定扩展名结尾 if [[ "$filename" == *."$ext" ]]; then echo "正在解压: $filename" case "$ext" in "tar.gz") tar -xzf "$file" ;; "tar.bz2") tar -xjvf "$file" ;; "tar.xz") tar -xJvf "$file" ;; "zip") unzip "$file" ;; *) echo "不支持的文件类型: $ext" ;; esac fi done done echo "批量解压完成。"脚本解释:
#!/bin/bash:指定脚本解释器为bash。这是 Shell 脚本的 shebang 行,告诉系统用哪个程序来执行这个脚本。file_extensions=("tar.gz" "tar.bz2" "tar.xz" "zip"):定义一个数组,包含要处理的压缩文件类型。数组是一种数据结构,可以存储多个值。for file in *; do:遍历当前目录下的所有文件。*是通配符,表示所有文件。for循环用于遍历一组值。filename=$(basename "$file"):获取当前文件名。basename命令用于从路径中提取文件名。$()用于执行命令并将结果赋值给变量。for ext in "${file_extensions[@]}"; do:遍历文件类型数组。${file_extensions[@]}表示数组的所有元素。if [[ "$filename" == *."$ext" ]]; then:判断文件名是否以当前文件类型结尾。[[ ]]是条件测试语句,==是字符串比较运算符,*是通配符。case "$ext" in ... esac:根据文件类型执行相应的解压命令。case语句用于多分支判断。"tar.gz") tar -xzf "$file" ;;:如果文件类型是tar.gz,则执行tar -xzf "$file"命令。"tar.bz2") tar -xjvf "$file" ;;:如果文件类型是tar.bz2,则执行tar -xjvf "$file"命令。"tar.xz") tar -xJvf "$file" ;;:如果文件类型是tar.xz,则执行tar -xJvf "$file"命令。"zip") unzip "$file" ;;:如果文件类型是zip,则执行unzip "$file"命令。*) echo "不支持的文件类型: $ext" ;;:如果文件类型不在列表中,则输出错误信息。
echo "批量解压完成。":输出完成信息。
如何运行脚本:
- 将脚本保存为
.sh文件,例如unpack_all.sh。 - 赋予脚本执行权限:
chmod +x unpack_all.sh - 在包含要解压文件的目录下运行脚本:
./unpack_all.sh
- 将脚本保存为
注意事项:
- Shell 脚本需要以
#!/bin/bash开头指定解释器。 - 可以使用
for循环遍历文件。 - 可以使用条件语句
if或case判断文件类型。 - 要赋予脚本执行权限才能运行 (使用
chmod +x命令)。 - 批量解压缩时,需要考虑目标目录是否存在同名文件,避免覆盖。可以在脚本中添加相应的判断和处理逻辑,例如先将文件解压到一个临时目录,然后再移动到目标目录。
- 脚本中没有对错误情况做全面的错误处理, 比如文件不存在,不是一个有效的压缩包等,这些可以根据实际需求进行完善。
- Shell 脚本需要以