本文介绍Linux中常用的命令行。
1. 文件处理
- 文件路径的表示
- 相对路径 / 绝对路径
.
代表当前路径,..
代表当前路径的上一级目录的路径
- 删除文件
rm 文件名
:删除文件rm -r 文件夹路径
:删除文件夹及其下所有内容rm -r /path/to/your/directory/*
:删除文件夹下所有内容,但不删除文件夹- 直接用
-r
删除文件夹会不停被问是否要删除xxx,需要一个一个回复yes
,解决方案是用-rf
,就不会问了(也没有反悔的机会了,所以需要慎重)
- 下载文件
- wget
wget 文件地址
:直接将文件下载到当前路径下
值得注意的是类似zenodo的文件,要删掉直接的下载链接后面的?download=1
语句
另外还有一种情况是直接用于下载的路径不明确,比如https://url/dataset_files?arg1=value1&arg2=value2这时我建议的解决方案是先用网页下载,然后在下载页面中直接复制下载路径,用这个下载路径在下载。这主要是考虑到对于一些大文件,从本地上传文件到服务器太慢了,直接用服务器从公网下载会快很多wget --spider 文件地址
:检查指定文件是否存在。不下载数据,一般用于测试网络连接情况和预测数据大小wget -P 文件夹 文件地址
:将文件下载到指定文件夹-O
重命名:如果重命名中包含路径,那么该路径必须实现创建好
-O
和-P
是冲突的,就是说如果你想指定保存到路径下并重命名得用-O
- curl1
- 如果想直接下载为内置的命名方式(也就是原来叫啥,下下来还叫啥):
curl -O 文件地址
- 指定下载到本地后的名称:
curl -o 名称 文件地址
- 如果想直接下载为内置的命名方式(也就是原来叫啥,下下来还叫啥):
- wget
- 复制文件
- 文件
cp source target
(target可以是文件路径或者文件夹路径) - 文件夹
cp -r source target
- 文件
- 移动和重命名:
mv 当前路径 要转移到的路径
将会转移到移动目标路径之下- 移动某文件夹下所有文件到另一个文件夹下:
mv 现文件夹/* 要转移到的文件夹
- 移动某文件夹下所有文件到另一个文件夹下:
- 新建文件夹:
mkdir
-p
/--parents
:需要时创建上层目录,如目录早已存在则不当作错误 - 直接在终端查看文件内容:
cat 文件路径
less
:查看文本文件2- 查看文件
- 第一行:
head -n 1 文件名
tail
- 第一行:
ls
- 查看当前文件夹下的所有文件和一级文件夹:
ls 文件夹路径
- 查看当前文件夹下的所有文件和一级文件夹的详细信息(
-l
长格式输出,-a
输出隐藏文件),其中文件大小以人能看懂的形式输出:-lh
这样的输出通常包括以下几个字段:- 文件类型和权限:这是一个由10个字符组成的字符串。第一个字符表示文件类型(例如,
-
表示普通文件,d
表示目录,l
表示符号链接等)。接下来的9个字符分为三组,每组3个字符,分别表示文件所有者、文件所属组和其他用户对该文件的读、写、执行权限。
例如:-rw-r--r--
表示这是一个普通文件,拥有者有读和写权限,而组内成员和其他人只有读权限。 - 硬链接数量:这个数字表示有多少硬链接指向这个文件或文件夹。
- 所有者用户名:这个字段表示文件的所有者是谁。
- 所有者所在组:这个字段表示文件所属的用户组。
- 文件大小:这个字段表示文件的大小。由于使用了
-h
参数,这个大小将以人类可读的格式(KB、MB、GB等)展示。 - 修改时间:这个字段显示了文件最后一次被修改的日期和时间。
- 文件/目录名:这个字段显示了文件或目录的名称。
以下是一个例子来解释ls -lh
命令的输出:
在这个例子中:-rw-r--r-- 1 username groupname 15K Jul 18 21:36 example.txt
- 文件权限:
-rw-r--r--
- 硬链接数量:
1
- 所有者:
username
- 所属组:
groupname
- 文件大小:
15K
- 最后修改时间:
Jul 18 21:36
- 文件名:
example.txt
- 文件类型和权限:这是一个由10个字符组成的字符串。第一个字符表示文件类型(例如,
- 包括隐藏文件一起查看:
-a
- 查看当前文件夹下的所有文件和一级文件夹:
lsattr
用于显示文件的扩展属性,这些属性通常用于文件系统级别的操作。- 这些扩展属性包括是否可以压缩(
c
)、是否可以进行安全删除(s
)、是否可以备份(b
)等。 - 该命令主要用于更底层、高级的文件系统管理。
- 示例:
输出可能如下:lsattr file1.txt
-------------e-- file1.txt
- 这些扩展属性包括是否可以压缩(
chattr
执行改变文件或目录的属性- 查看文件或文件夹大小:du命令
du -h 文件名称
:查看文件大小du -ah --max-depth=1 文件夹名称
:查看该文件夹及其下一层子文件夹的大小du -sh 文件夹名称
:仅显示该文件夹大小-h
:以人类可读的形式输出-a
:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小-s
:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
- 查看指定路径的总储存空间和已占用的储存空间:
df 文件夹路径
-h
:以人类可读的形式输出
- Linux服务器清文件
- anaconda清缓存:
conda clean -a
- huggingface.datasets清缓存:默认存放在
~/.cache/huggingface/datasets
中3,可以使用rm .cache/huggingface/datasets/ -rf
批量清除(别的几个包应该是类似的) - jedi清缓存:直接删
.cache/jedi
里的文件就行4:rm .cache/jedi -rf
- pip清缓存:
pip cache purge
- sentence-transformers清缓存:直接删
.cache/torch/sentence_transformers
里的文件 - wandb清缓存:
wandb sync --clean
- anaconda清缓存:
- 查看文件的创建时间(我直接问的ChatGPT,具体能否实现没试过)
对于文件的创建时间,Linux系统并不直接保存这个信息。在某些文件系统上,例如ext4或者btrfs,有一个叫做"birth time"或者"crtime"(creation time)的属性,它可能和你想要的创建时间相近。但是需要注意的是,这个属性并不总是被所有的文件系统或者操作系统支持,而且在一些操作上可能会被更改(例如在文件被复制的时候)。
在CentOS系统中,如果你的文件系统支持,你可以通过使用debugfs
来获取文件的创建时间。这是一个非常强大的命令,一般用于调试,所以要小心使用。下面是一个例子:
这里,sudo debugfs -R 'stat <inode>' /dev/sda1 | grep crtime
<inode>
是文件的inode number,/dev/sda1
是你的硬盘设备。你可以使用ls -i
来查看文件的inode number。
在Ubuntu系统中,你可以尝试使用stat
命令来查看文件的所有信息,这个命令可能会包含文件的创建时间(如果你的系统支持的话)。这个命令如下:
在这个命令中,stat filename
filename
是你想要查看的文件的名字。如果文件的创建时间被支持的话,你可以在输出的结果中看到一个 “Birth” 的字段。如果看不到这个字段,那可能是你的文件系统或者操作系统不支持保存文件的创建时间。 touch
修改文件或者目录的时间属性,创建普通文件- 在服务器之间传递文件或文件夹:scp命令5
- 上传文件:
scp -P 指定端口 本地文件路径 对方用户名@IP地址:目标文件路径
示例输出:
如图所示,第一次指定的对方服务器需要手动输入yes确认是否继续连接。
需要输入对方服务器密码
ETA(Estimated Time of Arrival)显示为30:51,这表示预计还需要30分钟51秒的时间来完成这次传输。 - 下载文件:
scp -P 指定端口 对方用户名@IP地址:文件路径 本地文件路径
- 上传文件夹:
scp -P 指定端口 -r 本地文件夹路径 对方用户名@IP地址:目标文件夹路径
- 下载文件夹:
scp -P 指定端口 -r 对方用户名@IP地址:文件夹路径 本地文件夹路径
- 上传文件:
- 查看文件的位置:
whereis
- 配合数据库查看文件位置:
locate
- 实际搜寻硬盘查询文件名称:
find
6
1.1 处理压缩文件
- tar命令:常见的压缩文件后缀
.tgz
.tar.gz
tar.bz2
- 查看压缩文件里的内容:
tar tf *.tar
tar tf *.tgz
tar tzf *.tar.gz
tar tjf *.tar.bz2
- 解压缩到指定路径:
tar -zxvf 压缩文件 -C 文件夹
- 查看压缩文件里的内容:
- zip文件
- 查看压缩文件里的内容:
zipinfo 压缩文件路径
- 解压文件:
unzip 压缩文件路径
- 解压文件到指定文件夹:
unzip 压缩文件路径 -d 文件夹
- 解压指定文件到指定文件夹:
unzip [zip文件路径] '[要解压的文件路径]' -d [目标文件夹路径]
- 查看压缩文件里的内容:
- bz2文件
- bzcat命令,查看文件内容:
bzcat *.bz2
(解压缩指定的.bz2文件,并显示解压缩后的文件内容。保留原压缩文件,并且不生成解压缩后的文件) - bunzip2命令
- 查看详细信息:
bunzip2 -v *.bz2
- 查看详细信息:
- bzcat命令,查看文件内容:
- rar文件
- 解压到指定文件夹:
unrar x yourfile.rar /path/to/destination/
- 解压到指定文件夹:
2. 进程、内存、CPU管理
- 查看系统整体进程情况(哪个用户在用什么命令运行进程,占用多少CPU,跑了多久等等):
top
:按P
按CPU使用率排序,按q
退出
-p PID
监控指定进程
-u username
监控指定用户名下的进程htop
:互动式的
pidof process_name
根据进程名返回pid7- 指定关键词(比如用户名)查询进程情况:
ps -ef | grep 关键词
- 使用进程PID,查看进程持有者:
ps aux | grep PID
(图中user位置就是进程持有者的用户名,红字就是PID,最后那一项是运行命令) - kill指定PID的进程:
kill PID
8 - 想打断本session正在运行的代码,可以直接用Ctrl+C实现。Python代码将会返回
KeyboardInterrupt
信息。 - 查看CPU情况:
lscpu
- 查看内存情况:
free -m
3. Linux脚本与可执行文件
- shell脚本好像基本上都做不了Anaconda的相关操作,因为Anaconda要么需要互动,要么需要conda init并重启shell
- 给shell脚本所有权限(使其可以运行):
chmod u+x sh脚本
- 运行shell脚本
- 直接运行
- 使用
sh
运行 - 使用
bash
运行(bash
和sh
的区别可参考这篇博文:linux:bash和sh区别_源代码杀手的博客-CSDN博客_linux sh和bash)
source
命令(点命令.
):通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。因为linux所有的操作都会变成文件的格式存在。
(对上面两种命令的区别可参考这篇博文:Linux中的source命令 - 皮皮祥 - 博客园)- shell脚本写循环的示例:
- 运行编程语言
- Python:安装Python环境后,进入Python虚拟环境直接运行
python Python程序路径
,或者运行python编译器路径 Python程序路径
即可 - C语言:将
.c
文件编译为可执行文件:gcc -o 可执行文件路径 .c文件 -Wall
直接调用可执行文件的路径即可执行
- Python:安装Python环境后,进入Python虚拟环境直接运行
- gcc
- 挂载进程
nohup 命令 >> 日志输出文件 2>&1 &
(使用该代码可以将进程挂载到后台运行,即使结束session也不会停止运行。注意事项:- 挂起后,当前session可以在终端使用
jobs
命令行查看进程运行状态,使用kill %jobs命令行中显示的索引
可以直接kill。 - 用
>
会覆盖原日志文件中的内容,>>
就直接追加9 - 挂起Python文件时:
- 如果不指定Python编辑器,需要在所需虚拟环境下运行Python命令。(感觉这是废话,但是加上)
- 在
python
后面加-u
可以使输出不缓存,直接输出 CUDA_VISIBLE_DEVICES=0
要放在nohup
前面
- 挂起后,当前session可以在终端使用
- nohup无法与运行中的进程互动,如果有这种需求可以使用
screen
或tmux
命令 tmux
:直接创造一个tmuxtmux new -s <session-name>
新建tmux,并起名(如果不起名的话,就会默认名称0、1这种)- 按Ctrl+b,松开,按d,即可从tmux退出(detach)
tmux attach -t <会话编号或名称>
或tmux attach-session -t <会话编号或名称>
重新进入tmux(attach)tmux ls
:查看当前的所有tmux
如果没有创建tmux,会报错,报错信息类似于:error connecting to /tmp/tmux-1018/default (No such file or directory)
- tmux无法使用鼠标滑轮的解决方式:进入
~/.tmux.conf
(如果没有,可以直接新建),添加set -g mouse on
命令,然后在终端输入:tmux source-file ~/.tmux.conf
,即可在tmux中正常使用鼠标滚轮 - tmux无法复制
- 按住shift,选择文本,右键点击Copy10(诡异的是我在一台服务器上无法使用这个操作,得用下一条)
- 进入复制模式:按下 Prefix 键(默认是 Ctrl + b),然后按 [。
开始复制:按下空格键。
结束复制:按下 Enter 键。(事实上直接Ctrl+C就行了)
- tmux卡住:Esc
- 删除一个窗格(分屏):按Ctrl+b,松开,按x,选择y
如果你希望在关闭窗格时不再收到确认提示,你可以在.tmux.conf
文件中添加以下行:
conf setw -g window-kill without-confirmation
这将关闭窗格时的确认提示。
注意:关闭一个窗格会终止在该窗格中运行的所有进程。确保你已经保存了所有的工作,并且确定要关闭窗格之后再进行这个操作。 - 删除tmux:
tmux kill-session -t <>
- screen
- 把当前正在前台运行的进程放到后台运行(关闭terminal后进程继续运行):
- Ctrl+Z暂停进程
bg %1
将前台进程转到后台(如果想放回前台用fg %1
)disown %1
从 shell 的作业列表中删除该作业
使用disown
后,你将无法通过作业控制再次访问该进程。如果你希望保持一定程度的访问能力,例如要查看进程的输出或将其带回到前台,你可能需要考虑使用screen
或tmux
这样的终端多路复用器。
- 将Python的输出重定向到文件中(正常在前台运行),输出也会正常在终端输出,应该是会直接覆盖原文件中的内容:
运行Python文件的命令 2>&1 | tee 存储输出的文本文件名
- 查看可执行文件的位置:
which
在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果 - 查看Java版本:
java -version
- python其他入参
- -m:直接运行模块的代码。在环境里面一般就不需要
python -m
这个前缀11
- -m:直接运行模块的代码。在环境里面一般就不需要
- vim12:
vi 文件名
进入编辑界面,i
实现插入,esc然后:
进入执行命令界面(后面接命令然后回车即可执行,w
保存,q
退出,q!
不保存退出,wq
保存并退出) code
命令通常用来启动 Visual Studio Code(VS Code),这是一款流行的开源代码编辑器,由 Microsoft 开发。如果你在终端中输入code
并且 Visual Studio Code 已经安装在你的系统上,它会启动 VS Code。
使用code
命令,你可以执行多种操作,包括:- 直接打开 VS Code:
这会启动 VS Code 的主窗口。code
- 打开特定文件或项目:
这会打开一个指定的文件或文件夹。如果路径指向一个文件夹,VS Code 会以工作区的形式打开整个文件夹。code path/to/your/file_or_folder
- 在当前目录中打开 VS Code:
这个命令会在 VS Code 中打开当前目录,非常适合快速开始编辑当前目录下的文件。code .
- 创建新文件或打开文件,并跳转到特定行:
code -r -g file_path:line_number
-r
参数告诉 VS Code 在已有窗口中打开文件,-g
参数用于打开文件并跳转到指定行。 - 列出在命令行中可用的所有选项:
这会显示所有可用的命令行选项,帮助你更好地掌握code --help
code
命令的使用。
确保code
命令可用的前提是你必须已经安装了 Visual Studio Code,并且在安装过程中或之后将 VS Code 的可执行文件路径添加到了系统的环境变量中。如果命令不可用,可能需要检查 VS Code 是否正确安装,或者手动添加其执行路径到你的环境变量。
- 直接打开 VS Code:
4. 网络配置与访问
ping
:默认会无限执行下去(Windows上默认4次)traceroute
13:显示数据包到主机间的路径hostname
14命令在Linux系统中用来显示或设置系统的主机名。通过该命令,你可以查看当前系统的网络节点名,或者在具有适当权限的情况下更改主机名。
基本的使用方法如下:- 查看当前系统的主机名:
hostname
- 设置系统的主机名(需要root权限):
sudo hostname new-hostname
- 显示主机的所有网络接口的IP地址:
hostname -I
这是一个非常实用的命令,尤其是在配置网络或进行故障诊断时,可以迅速获得主机所有接口的IP地址信息。执行该命令不需要管理员权限,普通用户就可以运行。- 查看当前系统的主机名:
ufw
(Uncomplicated Firewall)是一个面向用户友好的前端防火墙配置工具,用于管理基于netfilter的防火墙规则。它旨在通过简化的命令行界面来简化iptables的复杂性。ufw status
命令用于查看当前防火墙的状态,包括它是否被激活(启用)以及当前的规则列表。这可以帮助用户快速了解防火墙是否在运行以及哪些规则正在生效。
这个命令通常会返回如下信息:
Status: 显示防火墙是启用还是禁用。
规则列表: 显示所有已定义的入站和出站规则。
如果你需要查看更详细的规则(包括规则的编号),可以使用:
这会显示防火墙规则及其对应的编号,有助于管理和引用特定的规则,特别是在修改或删除规则时非常有用。ufw status numbered
ufw disable
用于关闭或禁用ufw
防火墙。执行这个命令后,系统上的ufw
防火墙将停止运行,所有通过ufw
设置的防火墙规则都不会再被应用。
这对于进行某些需要防火墙暂时关闭的网络配置或测试特别有用。要执行这个命令,你通常需要管理员权限。
执行后,你会收到一个确认消息,表明防火墙已被禁用。如果你想重新启用防火墙,可以使用:
这会重新激活ufw enable
ufw
防火墙,并重新应用之前定义的规则。ufw enable
用于启用ufw
防火墙。当你执行这个命令时,系统的防火墙将开始运行,并应用之前设置的所有ufw
规则。
启用ufw
防火墙通常需要管理员权限。
执行这个命令后,防火墙会被激活,并且你通常会看到一个确认消息,表明防火墙已经启动并处于活动状态。这个步骤是建立基本网络安全防护的重要组成部分,特别是在公共网络或互联网环境下运行的服务器上。启用防火墙可以帮助阻挡未经授权的访问尝试和其他潜在的网络攻击。
5. 其他
- 更换终端根路径:
cd 文件夹路径
- 修改密码:
passwd 用户名
(如果不输入用户名,就默认是当前用户)15 - 建立用户账号:
useradd 用户名
16 shasum
:创建或检查cryptographic SHA checksums- 计算文件的SHA1 checksum:
shasum {{filename}}
- 计算文件的SHA256 checksum:
shasum --algorithm 256 {{filename}}
(这个在安装anaconda时会建议对anaconda安装的sh脚本做,可以参考我写的博文Anaconda教程(持续更新ing…))
- 计算文件的SHA1 checksum:
- export命令17:设置或显示环境变量,仅对当前terminal有效
我比较常用这个命令的场合就是在使用深度学习框架时临时设置cuda/cudnn的位置,如TensorFlow 2echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/' > $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
或export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/
(见我撰写的博文TensorFlow安装教程)、paddlepaddleexport LD_LIBRARY_PATH=user_path/anaconda3/envs/envpaddlepaddle/lib:$LD_LIBRARY_PATH
(见我撰写的博文PaddleNLP教程(持续更新ing…)) - 清除屏幕:
clear
- 退出terminal:
exit
- 很多terminal都是鼠标左键复制,右键粘贴
- 搭建FTP服务器的相关参考资料(我现在感觉没必要建FTP服务器,自己上传和下载文件用WinSCP / VSCode或者云服务器平台官方提供的工具都可以,如果要集中收集大家的文件……为什么非要用FTP这种不安全的形式实现?)
- 查看Linux系统的详细信息18
lsb_release
:显示LSB和特定版本的相关信息
-a
显示上面的所有信息
cat /etc/*release
/etc/os-release
文件包含了Linux系统的基本信息。可以使用cat
命令来查看该文件的内容。
hostnamectl
uname -a
打印系统信息,包括内核版本、主机名、处理器架构等信息。
6. 常用软件
- Emacs
软件官网:Emacs中文网 - vi / vim:命令行编辑器19
据我所知一般云服务器平台都是默认安装的
进入vi界面示例:vi hello-vi-world.c
进入编辑模式:i 插入模式
退出编辑模式:Esc
(非编辑模式叫命令模式)
:
后面跟的命令:w
保存q
退出x
保存+退出- 将vim的tab修改为四个空格并显示行数:进入
~/.vimrc
添加:set number set ts=4 set expandtab
- 在vi界面中(命令模式运行)
关闭行号::set nonumber
开启行号::set number
20
整页翻页:向后翻Ctrl+f 向前翻Ctrl+b
翻半页 :向下翻Ctrl+d 向上翻Ctrl+u
滚一行:Ctrl+e Ctrl+y
gg
:命令将光标移动到文档开头
G
:命令将光标移动到文档末尾 - 如何设置缩进(我自己没试过):VIM中gg=G是什么?_51CTO博客_vim是什么意思
- 将vim的tab修改为四个空格并显示行数:进入
- 使用Git
CentOS平台安装软件:yum install git
查看软件版本:git version
设置用户名:git config --global user.name "username"
设置邮箱:git config --global user.email fake_name@fakedomain.com
(如果这两步不设置的话,将无法正常使用Git)
mkdir github1
cd ./github1
git clone Git下载地址
7. 本文撰写过程中参考的资料
- Linux 命令 rm(文件管理)——想玩转linux就请一直看下去
- Linux命令之rm(删除一切)_rm删除隐藏文件_单身bug的博客-CSDN博客
- Delete a file or directory
- 请教在linux 怎么用rm 删除目录和文件.不要提示_百度知道
- 【Linux】磁盘空间占用:查看某个文件或目录占用磁盘空间的大小_Lucky@Dong的博客-CSDN博客_linux查看文件夹占用空间
- Linux基础教程 linux scp命令的用法详解 - 百度文库
- linux利用scp远程上传下载文件/文件夹 | 《Linux就该这么学》
- Linux scp命令-菜鸟笔记
- 2021129:linux篇-查看压缩包里面的内容_微风❤水墨的博客-CSDN博客_linux查看gz文件内容
- linux压缩文件有哪些类型 - CSDN
- Linux tar 命令 | 菜鸟教程
- Linux bunzip2命令 | 菜鸟教程
- Linux如何查看文件内容?Linux常用命令_ITPUB博客
- linux wget指定下载目录和重命名_mob604756f56fd6的技术博客_51CTO博客
- Linux cp 命令 | 菜鸟教程
- Linux ps 命令 | 菜鸟教程
- linux – 进程的查看、进程id的获取、进程的杀死 - goodup - 博客园
- htop与top的区别_热气球、的博客-CSDN博客_htop和top
- Linux命令之touch命令_恒悦sunsite的博客-CSDN博客_linux touch
- Linux命令手册 - shasum命令手册,shasum命令详解
- 服务器后台运行程序(nohup/screen/tmux)_zeronose的博客-CSDN博客_服务器后台运行
- Tmux 使用教程 - 阮一峰的网络日志
- tmux无法使用鼠标滚轮滚动页面_小xing在北方的博客-CSDN博客
- Linux终端复用神器-Tmux使用梳理 - 散尽浮华 - 博客园
- tmux 快捷键 不起作用_kpiss的博客-CSDN博客_tmux快捷键不能用
- python将控制台输出保存至文件的方法 - 经验笔记
- 如何在 Linux 下查看进程是以哪个用户身份在运行的?_surfirst的博客-CSDN博客_linux查看进程用户
- mkdir -p的用法_Christo3的博客-CSDN博客
- 阿里云ECS服务器Linux创建新用户_zhangvalue的博客-CSDN博客
- tmux 命令快速入门_tmux 删除_lMasterSparkl的博客-CSDN博客
- 阿里云GPU服务器配置深度学习环境-远程访问-centos,cuda,cudnn,tensorflow,keras,jupyter notebook - 医疗兵皮特儿 - 博客园
- 在Linux下简单编写、编译并执行一个C语言程序_编写linux操作系统下可编译执行的一段c语言程序,包括二进制文件的创建、读写和关_知Hu·醉卧沙场的博客-CSDN博客:这篇博文在我第一次用Linux服务器的时候真的帮了我很多
- Linux lsattr命令 | 菜鸟教程
- linux wget指定下载目录和重命名_51CTO博客_linux重命名