Linux 目录结构
. 当前目录
.. 当前目录的上一级目录
~:家目录,是/home下相应用户的用户名显示的目录
/ :所有根的目录
/boot : 配置文件,内核和其他启动时所需文件,没它操作系统启动不起来
/etc :放置系统相关配置文件
/etc/passwd 存储用户账户信息
/etc/shadow 账户密码储存在这里(里面是影子化的密码文件,在里面看到的密码是乱码,被加密了)
/home :放置普通用户的目录
/mnt :硬盘上手动挂载(把硬盘链接在系统上)的文件系统,默认是空的
/media :自动挂载的硬盘分区以及类似CD及数码相机等可移动介质
/opt :默认是空的,存放一些可选程序,例如一些程序的测试版本
/root :管理员(根用户)目录
/bin : 常用命令文件存放的目录
/sbin:系统管理命令存放目录
/tmp:临时存放目录,存放的文件定期删除
/usr:存放不适合放在/bin或/etc目录下的额外工具,比如说游戏、打印工具等。其中
/usr/bin目录用于存放程序
/user/share用于存放一些共享数据
/usr/lib用于存放那些不能直接运行的,但是许多程序运行所必须的一些函数库文件
/var:存放那些经常被修改的文件,例如各种日志和数据文件
/var/log日志文件
/lost+found:一般都是空的,碰到断电时或者非正常关机后,有些文件就临时存放在这
/dev:存放设备文件,例如硬盘,U盘
linux操作系统将所有的设备都看作文件,
我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,
然后通过访问这个目录来访问存储设备。
语言环境
查看是否安装了中文
locale -a
安装软件
apt
注意,下面的apt命令是用于执行软件安装相关的,sudo命令是启用管理员身份
-
列出所有可更新的软件清单命令:sudo apt update
-
升级软件包:sudo apt upgrade
列出可更新的软件包及版本信息:apt list --upgradeable
升级软件包,升级前先删除需要更新软件包:sudo apt full-upgrade
-
安装指定的软件命令:sudo apt install <package_name>
安装多个软件包:sudo apt install <package_1> <package_2> <package_3>
-
更新指定的软件命令:sudo apt update <package_name>
-
显示软件包具体信息,例如:版本号,安装大小,依赖关系等等:sudo apt show <package_name>
-
删除软件包命令:sudo apt remove <package_name>
-
清理不再使用的依赖和库文件: sudo apt autoremove
-
移除软件包及配置文件: sudo apt purge <package_name>
-
查找软件包命令: sudo apt search <keyword>
-
列出所有已安装的包:apt list --installed
-
列出所有已安装的包的版本信息:apt list --all-versions
dpkg
dpkg是一个安装、构建、删除和管理Debian包的工具。所有源自“Debian”的linux的发行版都可使用dpkg命令,比如Ubuntu。
dpkg有个问题,就是不能像apt一样能识别安装程序的依赖程序并一起下载
dpkg(选项)(参数)
选项:
-i:安装软件包
-r:删除软件包
-P:删除软件包的同时删除其配置文件
-L:显示于软件包关联的文件
--unpack:解开软件包
-c:显示软件包内文件列表
-configure:配置软件包
(命令后面跟两个杠是长参数,跟一个杠是短参数,即长参数的简化)
常用命令
df
df 查看硬盘分区情况
-h 更人性化显示,大小是用k M G 显示
du
用于查看目录的大小
du -sh ./ 查看当前目录大小,(不加s会显示目录下面所有文件的大小信息,把他们递归出来)
du -sh ./*查看当前目录每个文件或子目录的大小
man
manue的简写,后跟命令,可以检查相关命令的用法
-k 模糊匹配,你在man -k 后面输入的命令会被检索出一系列含有该命令名字的其他命令(比如搜的是passwd,显示会包含gpasswd和chpasswd等其他命令)
-p精确匹配
date
显示日期,详见Linux date 命令 | 菜鸟教程 (runoob.com)
tzselect
用于选择时区
cal
用于显示日历
gedit
linux下的一个记事本
在用记事本写程序时,最上一样一定要加一个Shebang#!,这是用来指定你的解释器的
使用例:
#!/usr/bin/env python3
passwd
默认修改当前账户的密码(如果后面不跟用户名)
logout
注销
exit
退出终端
reboot
重启
shutdown
关机
-r now 立即重启
-r +5 三分钟之后重启
-h now 立即关机
-h +5 提示三分钟之后关机
-h 12:00 十二点关机
-c 取消关机
cd
切换目录
cd ..转到前一个目录
cd - 转到前一个目录(不是上一级目录!)
pwd
查看当前的工作路径
ls
查看当前目录下文件(如果又想用-a 又想用-l,可以直接-al)
-a 显示所有文件(包括前面打了个.的隐藏文件)
-A 和-a基本一样,只是不显示当前目录.和上一级目录..
-l 显示文件的详细信息,后面跟目录下的某文件可以显示文件信息
-l显示出的文件信息含义:
开头为-,代表普通文件
为d,代表是一个目录
为l,代表是链接文件(相当于快捷方式)
后面部分的rwxrwxrwx:
三个一组,分别代表用户(user),所在组(group),其他人(other)的权限
r表示可读,w表示可写,x表示可执行
ls abd* 星号叫做通配符,会自动识别星号以外文件名内含相同字符的文件
-r 按英文首字母逆向排序
-R 把当前目录下的文件都遍历一遍,可以用命令tree代替效果更好
mkdir
创建目录用
-p bb/cc/cc 可以一次性创建多层目录,不加-p会报错
rm
删除文件,rm命令不建议用,容易误删
-i 删除文件时给提示
-r 强制删除,这样也能删除目录
mv
既可以移动文件和目录,又可以给他们重命名
mv a.txt b.txt a文件重命名为b
mv a.txt /temp 把a文件移动到/temp目录下,这个目录会展示存放文件,一段时间后自动清除
cp
复制文件
cp file1 file2 复制file1 文件并命名为file2
cp -r aa/ bb/ 复制目录aa并命名为目录bb,必须加-r强制执行才可以
cp -a 复制文件时保留原来文件的读写权限
ln
为文件建立链接
ln [参数] 源文件 链接文件
ln -s 建立一个软链接(类似于快捷方式);删除源文件会让链接文件失效
不加任何参数,默认建立硬链接,文件大小同源。删除文件不改变链接文件
touch
修改文件时间
touch file1,若file1不存在则被创建
touch -c file1,若file1不存在不被创建
tiuch -r file1 file2 让file2的时间戳和file1相同
touch -t 201210120505.2 file1 指定时间
cat
显示文件内容
cat -n 增加行号
cat -s 把文件中的多个空行变成一个空行,但是一行只有空格不视为空格
tac
倒着显示文件内容
wc
显示文件的信息,输出分别为 行数 非空行行数 字符数,注意换行符这类占两个字符哦
-c 只看byte数,用了多少字节
-l 只看行数
-w 只看字数(单词)
sort
查看文件内容,但是按首字母(或数字)每行排序的
-r 按首字母逆序
-n 按纯数字大小排序
-b 忽略最前面的空格符
sort -t ‘你想用任意的符号替换分隔符’
uniq
扫描文件,重复行只显示一行
-c 显示行出现的个数
-u 显示时将有重复的行全部删除
cut
从一个文本文件中提取文本列,要配合参数使用
-d 后面加分隔字符。和-f一起用
-f 依据-d后面的分隔字符将一段信息分为几段,-f后面跟要取第几段,例如
cut -d : -f 3 aa.txt
-c 以字符为单位取出每行固定字符区间
cut -c 5 aa.txt 隔五个取一个,下一行继续
cut -c 1,5 aa.txt 取第一个和第五个放在一行,下一行重复进行
cut -c 1-5 取第一个到第五个,下行继续
cut -c 1-3,5 以此类推
tee
用来把前一个命令标准输入后输出的数据输出成一个文件例如
比如说想把cat的用法输出出来,就可以
cat --help | tee how_to_use_cat.txt
history
输出之前执行的所有命令
history 5 输出最近的五条
history !253 执行第253条命令
这里说一下感叹号有妙用
如果你之前输入了一个gedit命令
输入!ge就会检索并执行最近一个前面有ge的命令(不论是否能正确运行)
history调用的历史命令都储存在/home/用户名/.bash history里
more
也是浏览文件的命令
但是可以翻页,显示看了百分之多少
在more出来的文件中输入/后加你想寻找的内容便可以查找文本
less
也是浏览文件
head
也是浏览文件,默认是显示前十行
head -n 50 浏览前五十行
tail
也是浏览文件,默认是显示后十行,用法和head一样
但是tail有一个优秀点,tail -f 可以实时监控文件的变化(等同于tailf)
which
查看可执行的命令的所在位置
tar
打包或解压目录(注意,打包是把一堆目录文件合并成一个文件,压缩是把一个大文件通过算法变成一个比较小的文件。
常用参数
-c 创建.tar打包文件
-x 解包.tar文件
-v 显示详细信息
-z 压缩(.gz)或解压缩tar
-f 指定打包后的文件名,最后一个参数
例如
tar -czvf dir1.tar.gz dir1 #将目录dir1打包并压缩成dir1.tar.gz文件
tar -cf dir1.tar dir1 #打包
gzip dir1.tar #压缩
tar -xf dir1.tar #解包dir1.tar
tar -zxf dir1.tar.gz #解压并解包dir1.tar.gz
chmod
修改权限,u代表使用者,g代表组,o代表其他人,a代表所有人
chmod u=rw aa.txt 代表使用者可以读写但是不能执行文件aa
或
chmod u+w 给使用者增加可写权限
chmod u-w 限制使用者的可写权限
更聪明的是,linux给可读r=4,w=2,x=1,则7代表rxw,3代表-wx,以此类推
chmod 755 代表rwxr-xr-x
对于目录的rwx,可读代表你能查看目录下的文件,可写代表你能修改目录下的文件(增删,改时间等),可执行代表目录可以被使用(只能cd访问其他啥都不能干)
chmod -R 递归修改某目录以及目录下的所有程序的权限
chown
改变文件的所有者和所有组
chown someone aa.txt
chown someone:somegroup aa.txt
usreradd
添加用户
但是我们会发现添加的用户打开时显示在/home下找不到相应用户文件,这需要 useradd -m
还有可能因为指定目录的shell为/etc/sh出现的问题(Ubuntu就会碰到),这需要useradd -s /bin/bash
参数 参数说明
-b,–base-dirBASE_DIR 新帐户主目录的基本目录
-c,–commentCOMMENT 新帐户的GECOS字段
-d,–home-dirHOME_DIR 新帐户的主目录
-D,–defaults 打印或更改默认用户添加配置
-e,–expiredateEXPIRE_DATE 新帐户的到期日期
-f,–inactiveINACTIVE 新帐户的密码不活动期
-g,–gidGROUP 新帐户的主组的名称或ID
-G,–groupsGROUPS 新帐户的补充组列表
-h,–help 显示此帮助消息并退出
-k,–skelSKEL_DIR 使用这个替代的框架目录
-K,–keyKEY=VALUE 覆盖/etc/login.defs默认值
-l,–no-log-init 不要将用户添加到lastlog和faillog数据库
-m,–create-home 创建用户的主目录
-M,–no-create-home 不要创建用户的主目录
-N,–no-user-group 不要创建与用户同名的组
-o,–non-unique 允许创建具有重复(非唯一)UID的用户
-p,–password PASSWORD 新帐户的加密密码
-r,–system 创建一个系统帐户
-R,–root CHROOT_DIR 要导入的目录
-s,–shell SHELL 新帐户的登录shell
-u,–uidUID 新帐户的用户ID
-U,–user-group 创建与用户同名的组
-Z,–selinux-user SEUSER 为SELinux用户映射使用特定的SEUSER
创建新用户后,通常没有家目录下的配置文件(useradd忘了-m连家目录都没有),可以从/etc/skel/下拷贝到家目录,注销账号再登陆进去,source .bashrc (source是用来执行脚本文件的)后就能使用.bashrc提供的东西了
userdel
删除用户信息的,加上-r会删除除了用户信息包括家目录
usermod
用来修改用户账号的各项设定
- -c<备注> 修改用户帐号的备注文字。
- -d登入目录> 修改用户登入时的目录。
- -e<有效期限> 修改帐号的有效期限。
- -f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
- -g<群组> 修改用户所属的群组。
- -G<群组> 修改用户所属的附加群组。
- -l<帐号名称> 修改用户帐号名称。
- -L 锁定用户密码,使密码无效。
- -s<shell> 修改用户登入后所使用的shell。
- -u<uid> 修改用户ID。
- -U 解除密码锁定。
groupadd
添加组
-g 可以给组赋予一个ID,最好1000以上
groupmod
修改组
和usermod用法一样
id
用于查看用户信息
vi
一个编辑器
su
登录用户,最好要加个 -
su - usr1
sudo
暂时作为管理员运行文件,是一个安全保障,并且文件/etc/sudoers 里面可以配置sudo运行时的参数(比如对什么用户或组需要管理员权限等等,还可以直接执行命令visudo)
alias
取别名,给一些复杂的命令取个简单点的名字
alias ll='ls -l'
但是如果想长期保存这些命令,必须要取修改在配置文件 ~/.bashrc
echo
就是打印,把内容输出
-n 后的结果是没有换行
locate
查找文件
locate 想查找内容
例如:
locate /etc/sh,只要文件的路径有/etc/sh这几个字符,都会显示出来
locate -i 忽略大小写
如果不久(当天)新建了一个文件,locate是找不到的,需要输入命令updatedb更新数据库才能用locate查找
find
也是查找文件,但是locate是从数据库内查找(所以要updatedb),而find是从磁盘内遍历查找
find /home/ -name ‘*a.txt’,即在/home目录下以名字查找名字末尾为a.txt的文件
find /home/ -iname ‘*a.txt’,不区分大小写
find /home/ -type f,按文件类型查找,f代表普通文件
find /home/ -maxdepth 2 -type f,查找时指定最大查找深度,即再往下找几个文件夹到底
find /home/ -mindepth 2 -type f,指定最小深度,从往下第几个文件夹开始查
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: socket
find /home/ -size 10M 查找大小大于10m的文件
find /home/ -size 10M 查找大小小于10m的文件
b 代表 512 位元组的区块,c 表示字节,k 表示 kilo bytes,M,G。
下列是按时间查找的方法
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比文件 file 更晚被读取过的文件
-atime n : 在过去 n 天内被读取过的文件
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比文件 file 更新的文件
-ctime n : 在过去 n 天内创建的文件
-mtime n : 在过去 n 天内修改过的文件
find /temp/ -nouser 找没有所有者的文件
-nogroup 没有所有组的文件
find /temp/ -uid 1003 按用户id查找
find /temp/ -gid 1003 按组id查找
find /temp/ -user www 按用户名查找
find /temp/ -perm 777 按权限去查找
可以通过逻辑语-a和-o来增加查找要求,例如
sudo find /home -user www -a -perm 664,即按照用户名为www权限为664查找相应文件
find /temp/ -perm 777 -ok ls -l 对执行结果显示详细信息,-ok后面跟对前面结果进行的操作
mount
挂载文件
mount /dev/cdrom /mnt 把光驱/dev/cdrom挂载到/mnt下,打开/mnt能看到光盘的内容
mount -o remount /mnt 可以在不卸载的方法下重新挂载
mount a.iso -o loop /mnt 从镜像文件里面复制文件到/mnt
umount
卸载
若卸载光盘时显示busy,umount -l 强制卸载
快捷键
ctrl+c,强制终止任务
ctrl+l,清屏
tab,自动补全命令,按两下显示所有可能的命令
ctrl+k,删除当前光标所在位置后面的内容
ctrl+u,删除当前光标所在位置到行首的内容
ctrl+w,删除当前光标所在位置到前面第一个空格的内容
ctrl+y,恢复之前删除的命令
ctrl+a,将光标移动到最前面
ctrl+e,将光标移动到最后面
ctrl+r,搜索之前打出的一个命令
ctrl+d,退出当前shell命令行
ctrl+shift++,屏幕字变大
ctrl+-,屏幕字变大
alt+. 依次找之前命令跟的字符串(必须先打一个命令)
符号
管道符 |
主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。
例如: cat a.log | wc
重定向 >
> 一个存在的文件,文件清空
> 一个不存在的文件, 生成一个空文件
echo ‘123’ > aa.txt 删除文件内容,添加123
echo ‘123’ >> aa.txt 往此文件内追加输入文本123
1> 代表输入且只输入前面命令标准正确输入的内容,意思和>一样, dsawdsaw 1> aa ,在aa中结果为空
2>代表输入且只输入前面命令标准错误输入的内容,dsawdsaw 2> aa ,在aa中结果为报错信息的文本内容
&>代表标准正确和错误输出一起输入进文件
通配符*
查找文件时加不全的文件名加*,省略后面的字符进行模糊查找
反引号`
反引号是波浪线~那个键不按shift时打出来的符号,不要和正引号弄反了
反引号的作用是,反引号内的文本作为命令执行,例如
ll `sudo find /home/ -type f`
流编辑器
sed
sed 参数 动作 文件
参数:
-e command,--expression=command允许多台编辑。
-h,--help打印帮助,并显示bug列表的地址。
-n,--quiet,--silent安静模式,本来sed会把所有行都列出来,-n后只出现处理过的行
-f,--filer=script-file直接将sed的动作写在文件里。-f filename 则可以运行filename内的动作。
-i 直接修改文件内容,不输出到终端
动作:
p | 打印匹配行(和-n选项一起合用) |
= | 显示文件行号 |
a\ | 在定位行号后附加新文本信息 |
i\ | 在定位行号后插入新文本信息 |
d | 删除定位行 |
c\ | 用新文本替换定位文本 |
w filename | 写文本到一个文件,类似输出重定向 > |
r filename | 从另一个文件中读文本,类似输入重定向 < |
s | 使用替换模式替换相应模式 |
q | 第一个模式匹配完成后退出或立即退出 |
l | 显示与八进制ACSII代码等价的控制符 |
{} | 在定位行执行的命令组,用分号隔开 |
n | 从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理 |
N | 在数据流中添加下一行以创建用于处理的多行组 |
g | 将模式2粘贴到/pattern n/ |
y | 传送字符,替换单个字符 |
一般是d,p,s用的比较多
使用例子 sed ‘3,5d’ a.txt 删除文件a的第三行到第五行内容
sed '/aaa/,/bbb/d' a.txt 删除文件字符aaa那行到字符bbb那行间所有内容
sed '/aaa/+3d' a.txt 删除aaa那一行后三行内容
sed '5~2d' a.txt 从第五行开始删除偶数行,要删除奇数行就是~1
sed ‘3,5p’ a.txt 打印文件a的第三行到第五行内容
sed ‘\$p’ a.txt 打印文件最后一行
sed ‘\$c\good’ a.txt 修改最后一行为good
sed 's/aaa/bbb/' a.txt 把最前面的aaa内容替换为bbb
sed 's/aaa/bbb/g' a.txt 把全部aaa替换为bbb
sed 's/\(aa\)\(a\)\1bbb\2/' 把aaa拆分中间加入bbb,输出aabbba
或 sed -r 's/(aa)(a)/\1bbb\2/'
x | x为行号 |
x,y | 表示行号从x到y |
/pattern | 查询包含模式的行 |
/pattern /pattern | 查询包含两个模式的行 |
pattern/,x | 在给定行号上查询包含模式的行 |
x,/pattern/ | 通过行号和模式查询匹配的行 |
x,y! | 查询不包含指定行号x和y的行 |
awk
awk
'{pattern + action}'
{filenames}
awk '{print $2}' z.txt 打印文件每行第二列的词组(以空格为界,$0代表整行)
变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号(行数)
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数(分隔符之间的叫域,相当于一个单词,NF就相当于单词数)
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
例 awk '{print FNR}' z.txt
awk 'BEGIN{OFS='_'}{print $1}END{}' 可以预定义域分隔符为_
vi vim
操作是一样的,只是vim更有好一些
(感谢原作者ICer消食片,若有侵权会立即删除)
按esc便命令模式
命令模式下按i是插入模式,大写I是在行首进入插入模式
小写a是光标向后移动一个位置进入插入模式,大写A是在末尾进入插入模式
小s是删除当前字符进入编辑模式,大S是删除当前行并进入编辑模式
小o是在当前行下一行开启一个新行并进入编辑模式,大O是在当前行的上面插入一个空行并进入编辑模式
大R是替换模式,替换当前光标后面所有内容,写多少替换多少,小r是替换当前字符
按两下小g是到文章开头,两下大G是到文章结尾,如果想到特定行,可以16G,便跳到16行
按下3+便是向下移动三行,按下3-便是向上移动
按下5h向左移动五个字符,按下5l为向右移动五个字符,按下5j为向下移动五个,按下5k向上移动五个
按下$ 到行尾
按下^到行首
按两下小d删除一行,3dd删除三行,d$为删除当前位置到行尾,d^为删除当前位置到行首
在命令模式下按冒号:,再w,这是存储
yy为复制当前行,3yy为复制三行,y$为复制当前位置到行尾的内容,y^你懂的,p为粘贴
u为撤销,ctrl+r是反撤销
w是每次走一个‘单词’,b移动到当前单词的行首,e移动到当前单词的行尾
查找:/想找到内容 查找光标以下的内容 按n 为从上往下查找 按N为从下往上查找
?想查找的内容 查找光标以上的内容
:q是退出
:wq是保存并退出
:!q是强制写入
:!w是强制写入
:set nu 显示行号
:s/i/j/ 把当前行离行首最近的i替换为j
:s/i/j/g 把整行i变为j
:%s/i/j/g 把整个文章的i变为j
:1,3s/i/j/g 把一到三行的~~~~~~
环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
可用env查看当前用户下的环境变量
可用export直接设置当前用户的环境变量,例:export LANG='zh'
常用环境变量
PATH
修改环境变量PATH是为了直接运行一个程序而不需要再输入具体路径
对单个用户修改:~/.profile --> PATH='要增加的路径 :$PATH'
对全体用户修改(不推荐):/etc/profile --> PATH='要增加的路径 :$PATH'