1、Linux一般文件系统管理类的命令
1. 【cp】复制文件
- 只是复制文件数据,元数据是不会复制的,复制的数据存储在单独的磁盘块里面
- 格式:cp [选项] 源文件或目录 目标文件或目录
-
- cp 源文件 目标目录[/xxx]
-
-
- ---->目标不存在,复制到指定路径 [重命名]
- ---->目标存在,覆盖
-
-
- cp 源文件... 目标目录[/xxx]
-
-
- ---->目标目录必须存在
-
-
- cp 源目录 目标目录[/xxx]
-
-
- ----->默认不被支持,需要接 -r选项
- ----->目标目录不存在,会新建目标目录,复制源目录所有文件到目标目录中
-
- 选项:
-
- 【-i】:交互提示
- 【-r】:递归复制目录及其子内容
- 【-f】:强行复制
- 【-p】:复制保持源文件的属性信息(权限)
- 示例
#1、将文件 file1.txt 复制到当前目录下,命名为 file2.txt:
cp file1.txt file2.txt
#2、将文件 file1.txt 复制到目标目录 destination/:
cp file1.txt destination/
#3、复制目录 dir1/ 及其下所有文件和子目录到目标目录 destination/:
cp -r dir1/ destination/
#4、复制文件 file1.txt 到目标目录 destination/,并保留文件属性:
cp -p file1.txt destination/
#5、当目标文件已存在时,提示用户是否覆盖:
cp -i file1.txt destination/
#6、显示详细的复制过程信息:
cp -v file1.txt destination/
2. 【mv】移动文件
- 格式
-
- mv [option]...[-T] 源 目标---->目标存在,即覆盖
- 选项
-
- 【-f】:强行移动----->如果多个源文件,目标不能是文件
----->如果源是目录,将目录里面的东西全部移走,源目录自动删除
----->如果源文件移动到同一目录,目标即重命名。
- 示例
#1、将文件 file1.txt 移动到目标目录 destination/:
mv file1.txt destination/
#2、将文件 file1.txt 移动并重命名为 file2.txt:
mv file1.txt file2.txt
#3、将目录 dir1/ 移动到目标目录 destination/:
mv dir1/ destination/
#4、交互式地将文件 file1.txt 移动到目标目录 destination/:
mv -i file1.txt destination/
#5、显示详细的移动过程信息:
mv -v file1.txt destination/
3. 【rm】删除文件或目录
- 非常危险 不会触发回收站,删除的文件无法恢复
- 格式:rm [选项] 文件或目录
- 选项
-
- 【-i】:交互式删除,删除前提示用户确认。
- 【-f】:强制删除,不提示用户确认。
- 【-r】 或 【-R】:递归删除,用于删除目录及其下所有文件和子目录。
- 【-v】:显示详细信息,显示删除的文件名。
- 示例
#1、删除一个文件:
rm file.txt
#2、删除多个文件:
rm file1.txt file2.txt file3.txt
#3、递归删除一个目录及其下所有文件和子目录:
rm -r directory
#4、交互式删除文件:
rm -i file.txt
#5、强制删除文件,不提示确认:
rm -f file.txt
#6、显示详细信息,删除文件:
rm -v file.txt
4. 【ln】创建链接文件
- (在文件系统中创建一个文件或目录的链接)
- 链接文件:链接有软连接和硬连接(hard link)之分的,软连接(symbolic link)又叫符号连接
-
- ln提供了一种有效的方式来创建文件系统中的链接,使得用户可以方便地访问文件或目录,并在系统中共享文件和目录
- 软链接与硬链接的区别
-
- 硬链接可认为是文件的克隆,元数据信息一样;
- 符号链接(软链接)则是系统新建一个链接文件,此文件指向其所要指的文件,相当于Windows下的快捷方式。
- 软链接可对文件和文件夹,而硬链接仅针对文件。
- 通常用的还是软连接比较多
- 硬链接是文件系统中同一文件的另一个名称,而符号链接是指向目标文件的路径
- 符号链接可以跨越文件系统和文件系统边界,而硬链接只能在同一个文件系统内创建。
-
- 删除原始文件不会影响硬链接的可用性,但会使符号链接失效。
- 符号链接的权限和所有权是指向的文件的权限和所有权,而硬链接的权限和所有权与原始文件相同。
- 格式:ln [选项] 源文件 目标文件
- 选项
-
- 【-s】 或 【--symbolic】:创建符号链接。
- 【-f】 或 【--force】:强制执行操作,即使目标文件已经存在。
- 【-i】 或 【--interactive】:交互式操作,当目标文件已存在时提示用户是否覆盖。
- 【-v】 或 【--verbose】:显示详细的链接过程信息。
- 注意:
-
- 如果源文件损坏或位置发生改变,符号链接文件不可用!
- 一般情况下,符号链接文件的权限没有意义!
- 删除软链接一定要注意,不要加-r 也注意后面不要补/
- 对于一个文件来说,有唯一的索引节点与之对应,而对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问该文件。注意在Linux下是一切皆文件,文件夹、新加的硬盘 ...都可以看着文件来处理的。
- 示例
#1、创建硬链接:
ln file1.txt link1.txt
#2、创建符号链接:
ln -s file1.txt link1.txt
#3、创建硬链接并覆盖已存在的目标文件:
ln -f file1.txt link1.txt
#4、创建符号链接并覆盖已存在的目标文件:
ln -sf file1.txt link1.txt
#5、交互式地创建符号链接:
ln -si file1.txt link1.txt
#6、显示详细的链接过程信息:
ln -sv file1.txt link1.txt
5. 【du】所占用磁盘空间
- 查看文件或目录所占用的磁盘空间大小(du---->disk use)
- 格式:du [选项] [文件或目录]
- 选项
-
- 【-h】 以人类通俗易懂的方式显示占用磁盘空间字节数
- 【-s】 只显示目录内所用文件占用磁盘空间的总和
- 【-c】:显示所有列出的文件或目录的总计大小。
- 【-a】:显示所有文件和目录的大小,包括隐藏文件和目录。
- 【--max-depth=N】:限制显示文件或目录的层级深度。
- 【--exclude=pattern】:排除符合指定模式的文件或目录。
- 常见指定模式
- 示例
#1、查看当前目录下所有文件和目录的大小:
du
#2、以人类可读的格式显示当前目录下所有文件和目录的大小:
du -h
#3、显示指定目录的总计大小:
du -s directory
#4、显示指定目录及其子目录的大小,并以人类可读的格式显示:
du -h directory
#5、显示指定目录下所有文件和目录的总计大小:
du -c directory
#6、显示指定目录下所有文件和目录的大小,包括隐藏文件和目录:
du -a directory
#7、排除指定模式的文件或目录,并显示总计大小:
du --exclude=*.txt directory
#8、限制显示文件或目录的层级深度:
du --max-depth=2 directory
#常见的指定模式
#1、排除所有以.log结尾的文件:
--exclude=*.log
#2、排除所有以temp开头的目录:
--exclude=temp*/
#3、排除所有以backup开头的目录或文件:
--exclude=backup*
#4、排除所有以test开头的目录或文件,但不排除test/目录本身:
--exclude=test --exclude=test*/
#5、排除所有名为file1.txt的文件:
--exclude=file1.txt
#6、排除所有名为file1或file2的文件:
--exclude=file[12]
#7、排除所有包含数字的目录:
--exclude=*[0-9]*/
6. 【time】测量程序执行的时间
- 在命令执行完毕后,输出命令的执行时间信息,包括实际时间、用户CPU时间和系统CPU时间。
- 格式:time [选项] 命令 [参数]
- 时间信息解释:
-
- real:实际经过的时间(墙上时钟时间),从命令启动到结束的实际时间
- user:用户CPU时间,命令执行期间CPU为用户进程服务的时间
- sys:系统CPU时间,命令执行期间CPU为系统内核服务的时间
- 常用选项:
-
- 【-p】:以可解析的格式输出时间信息。
- 【-f FORMAT】:自定义输出格式。
- 【-o FILE】:将时间信息输出到指定文件。
- 示例
#1、测量命令的执行时间
time ls
#2、使用 -p 选项以可解析的格式输出时间信息:
time -p ls
#3、使用 -f 选项自定义输出格式:
time -f "real: %e, user: %U, sys: %S" ls
#4、将时间信息输出到文件:
time -o output.txt ls
2、bash shell特殊功能和用法
1. 【alias】创建命令别名
- (为常用命令或命令序列指定一个简短的替代名称)
- 格式:
-
- alias [别名[='命令序列']]
- 无选项:alias——>显示当前所有的别名
- 撤销别名【unalias alias_name】
- 注意事项
-
- 别名只在当前shell会话中有效,一旦退出shell,别名就会失效
- 要使别名永久有效,可以将其添加到shell的配置文件中,家目录下.bashrc或.bash_profile
- 使用别名时应当避免和系统命令重名,以免造成混淆。
- 别名可以包含任何有效的命令序列,包括管道、重定向、命令替换等。
- 别名和原命令重合,想使用原命令,使用\即可
- 示例
#1、创建别名:
alias ll='ls -l'
#2、创建包含多个命令的别名:
alias update='sudo apt update && sudo apt upgrade'
#3、显示当前所有的别名:
alias
#4、删除别名:
unalias ll
2. bash shell通配符
- (glob通配符)---->针对文件名、
- 通配符:
*:匹配任意长度的任意字符 ?:匹配任意单个字符 []:匹配指定字符范围内的任意单个字符 [[:upper:]]:大写字母 [A-Z] [[:lower:]]:小写字母 [[:alpha:]]:所有字母 [a-z] 不区分大小写 [[:digit:]]:所有数字 [0-9] [[:alnum:]]:字母+数字 [0-Z] [[:space:]]:空格 [[:punct:]]:标点符号 特殊字符 [^]:匹配指定字符范围外的任意单个字符 |
3. 其他bash shell的特殊字符
- 【;】分号符——可以实现在shell界面同时操作多个命令,注意:命令和命令之间可以没有逻辑关系
- 【()】单小括号——(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
- 【{}】单大括号——命令展开符号 { cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
- 对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。(这意味着括号外部的重定向符将应用于括号内的所有命令,而括号内部的重定向符只会影响到括号内部的单个命令。)
- 扩展
|
- 示例
#1、分号符将三个命令分隔开来,依次执行了echo、ls和pwd命令
echo "Hello"; ls -l; pwd
#2、括号内的三个命令会在一个新的子shell中依次执行
(echo "Hello"; ls -l; pwd)
#3、大括号内的三个命令会在当前shell中依次执行。
{ echo "Hello"; ls -l; pwd; }
3、I/O重定向
- I:input(输入数据流;O:output(输出数据流)
-
- 输入重定向【<】——>(覆盖)【<<】——>(追加) 标准输入(键盘),stdin
- 输出重定向【>】——>(覆盖)【>>】——>(追加) 标准输出(显示器),stdout
标准错误输出(显示器):stderr
-
- 如果重定向的目标I/O文件不存在即创建
- 重定向操作
-
- 【set -C】:禁止I/O 覆盖重定向操作
- 【set +C】:开启I/O覆盖重定向操作
-
- 强行使用重定向操作 【>|】
-
-
- 语法:command >| 文件名
- 【>|】操作符可以确保无论目标文件是否存在,都会执行输出重定向
- 举个例子,假设有一个文件 output.txt,内容为 "Old content",现在希望使用 echo "Hello" 命令将 "Hello" 追加到文件中
-
-
-
-
- 如果 output.txt 文件不存在,这条命令就会创建一个新的文件,并将 "Hello" 写入其中
- 如果 output.txt 文件已经存在,那么 "Hello" 将会被追加到文件的末尾,结果就是文件内容为 "Old contentHello"。
-
-
-
- 实现标准输入重定向的符号 【EOF】
-
-
- << EOF EOF 可以生成文件
- Bash 将会读取从 << EOF 到下一个 EOF 标记之间的文本,并将其作为标准输入输入到命令中,在输入结束后,命令会执行并处理输入的文本内容。
-
-
- 高级重定向写法
-
-
- 【cmd <<< "string"】
- 使用 【<<<】符号来进行高级重定向,这种写法称为 here-string
- 它允许将一个字符串作为标准输入(stdin)传递给命令,而不是从文件或其他来源读取输入。
- 可以使命令直接读取字符串,而无需创建临时文件或者使用额外的重定向符号
-
-
- 示例
set -C # 禁止I/O 覆盖重定向操作
set +C # 开启I/O 覆盖重定向操作
# 强行使用重定向操作
echo "Hello" >| output.txt #将 "Hello" 写入到 output.txt 中,如果文件存在则覆盖
# 实现标准输入重定向
1、假设有一个脚本 count_lines.sh,用于统计输入的文本中包含的行数,内容如下:
wc -l # 统计输入的文本行数
2、统计一段文本中包含的行数,并将这段文本作为标准输入输入到 count_lines.sh 脚本中
#使用 << EOF 重定向输入到 count_lines.sh 脚本中
bash count_lines.sh << EOF
This is line 1.
This is line 2.
This is line 3.
EOF
3、
cat > output.txt <<EOF
line 1
EOF
# 高级重定向写法
wc -c <<< "Hello World" #统计文件中的字节数
# 使用 <<< 符号将字符串 "Hello World" 作为标准输入传递给 grep 命令
grep "World" <<< "Hello World" #grep 是文本搜索工具,将匹配到的行输出到标准输出
- Linux的特殊设备文件
-
- 黑洞 /dev/null 白洞/dev/zero
-
- 黑洞 (/dev/null)
-
-
- 作用:一旦将数据写入到它,数据就会被立即丢弃,消失无踪。同样,从黑洞中读取数据会得到一个空文件。
- 用途:
-
-
-
-
- 用于丢弃不需要的输出:当一个程序产生输出但我们不想要保存时,可以将其输出到黑洞,而不会占用磁盘空间。
- 用于测试目的:有时我们可能需要一个输出流,但实际上不关心这个输出,可以将其输出到黑洞,以免输出对其他操作产生影响。
-
-
-
- 白洞 (/dev/zero)
-
-
- 作用:从它读取数据会得到一个连续的流,该流中的每个字节都是二进制零。
- 用途:
-
-
-
-
- 用于生成指定大小的空文件:可以将其输出重定向到文件中,以快速生成指定大小的空文件。
- 用于初始化文件内容:可以将其输出重定向到需要初始化的文件中,将文件填充为零值。
- 摧毁文件系统中的数据
-
-
-
- 示例
command > /dev/null # 将命令的输出重定向到黑洞,不保存输出
dd if=/dev/zero of=empty_file bs=1M count=1024 # 生成一个大小为1GB的空文件
- 【fd】文件描述符(File Descriptor)(不是指令)(windows中通常叫文件句柄)
-
- 是一个与打开文件相关联的整数标识符,是操作系统内核用来标识和操作文件或其他输入/输出资源的一种方式。每个进程在执行时都会有一张文件描述符表,用于跟踪打开的文件和其他I/O资源
- 文件描述符的前三个值是预留给标准I/O流
-
-
- 0:标准输入(stdin),通常是指从键盘输入的数据。
- 1:标准输出(stdout),通常是指向终端的输出。
- 2:标准错误(stderr),用于错误消息的输出。
-
-
- 除了这些标准文件描述符外,其他文件描述符通常是由 open()、socket()、pipe() 等系统调用返回的。每个文件描述符都对应着一个打开的文件、设备或管道等。在使用文件描述符时,通常可以对其进行读取、写入、关闭等操作
- 文件描述符和标准I/O流
-
-
- 【>】 或【1>】——>正确覆盖输出
- 【>>】 或 【1>>】——>正确追加输出
- 【2>】 或【2>>】——>错误覆盖或追加输出
- 【&>】——>混合输出
- 合并正常输出流和错误输出流 COMMAND > /path/to/somefile 2>&1
-
-
- 示例
1、打开文件并读取内容
exec 3< file.txt # 打开文件并将文件描述符保存到变量fd中
cat <&3 # 读取文件内容并输出到标准输出
exec 3<&- # 关闭文件描述符
2、使用 read() 系统调用读取文件内容
exec 3< file.txt # 打开文件并将文件描述符保存到变量fd中
read -u 3 line # 读取文件内容到变量line中
echo "$line"
exec 3<&- # 关闭文件描述符
3、复制文件描述符
exec 3< file.txt # 打开文件并将文件描述符保存到变量fd中
exec 4<&3 # 复制文件描述符3到文件描述符4
cat <&4 # 读取文件内容并输出到标准输出
exec 3<&- # 关闭文件描述符
exec 4<&-
使用文件描述符 0、1、2 的代码示例
1、使用文件描述符 0(标准输入)读取用户输入:
echo "Please enter your name:" # 从标准输入(键盘)读取用户输入,并存储到变量name中
read name
echo "Hello, $name!" # 输出读取到的用户输入
2、使用文件描述符 1(标准输出)输出信息到终端:
echo 1> "Hello, world!" # 输出信息到标准输出(终端)
3、使用文件描述符 2(标准错误)输出错误信息到终端:
cat non_existent_file.txt 2>/dev/null || echo "Error: File not found."
# 试图访问一个不存在的文件,将会产生一个错误信息
4、echo命令详解
- 【echo】:在shell交互式界面产生数据流(用于在终端中打印输出文本)
-
- 语法:echo [选项] [字符串]
- 选项:
-
-
- 【-n】 阻止自动换行
- 【-e】 启用特殊字符转义(允许 echo 解释特殊字符序列,并将其转换为相应的控制字符。)
- 【-E】:禁用特殊字符转义
- 【\n】 new line 换行且光标移至行首
- 【\t】 horizontal tab 插入tab;
- 【--help】:显示帮助信息,列出 echo 命令的使用说明和可用选项。
- 【--version】:显示版本信息,显示 echo 命令的版本信息。
-
-
- 示例
#1、输出文本字符串:
echo "Hello, World!"
#2、输出文本字符串并不换行:
echo -n "Hello, "
echo "World!"
#3、使用特殊字符转义输出带颜色的文本:
echo -e "\e[1;31mError:\e[0m Something went wrong"
#4、输出变量的值:
name="Alice"
echo "Hello, $name"
#5、输出特殊字符序列:
echo -e "This is a \t tab character"
echo -e "ccc\nddd\nfff" > file1.txt
cat file1.txt
- echo 高级用法
-
- "\033[字符背景颜色;字体颜色m字符串\033[0m"
- \033[30m -- \033[37m 设置前景色
- \033[40m -- \033[47m 设置背景色
#字符背景颜色范围: 40--47 | #字体颜色: 30--37 | 颜色只是以下控制码中的一种,如下是常见的一些ANSI控制码: |
40:黑 41:红 42:绿 43:黄 44:蓝 45:紫 46:深绿 47:白色 | 30: 黑 31: 红 32: 绿 33: 黄 34: 蓝 35: 紫 36: 深绿 37: 白色 | \033[0m 关闭所有属性 \033[1m 设置高亮度 \033[4m 下划线 \033[5m 闪烁 \033[7m 反显 \033[8m 消隐 \033[nA 光标上移n行 \033[nB 光标下移n行 \033[nC 光标右移n列 \033[nD 光标左移n列 \033[x;yH 设置光标位置x行y列 \033[2J 清屏 \033[K 清除从光标到行尾的内容 \033[s 保存光标位置 \033[u 恢复光标位置 \033[?25l 隐藏光标 \033[?25h 显示光标 \033[2J\033[0;0H 清屏且将光标置顶 |
5、ASCII码
man ascii
补充
|
6、语言环境
echo $LANG
LANG=zh_CN.UTF-8
补充
|