一、linux命令。
1、cp -> 拷贝文件/目录。
用法:cp 需要拷贝的文件/目录的路径 ... 目标目录的路径
1)拷贝文件到目录下。
gec@ubuntu:~$ cp kkk.c test -> 拷贝一个
gec@ubuntu:~$ cp aaa.c bbb.c kkk.c test -> 拷贝多个
gec@ubuntu:~$ sudo cp aaa.c /
2)拷贝目录到目录下。
gec@ubuntu:~$ cp test test2 -r -> test2在,就直接将test/目录拷贝到test2目录下。
-> test2不在,就先创建test2,然后将test/目录拷贝到test2目录下。
gec@ubuntu:~$ cp test test2 test3 -r -> test3必须存在,否则就会报错。
2、mv -> 移动/重命名。
gec@ubuntu:~$ mv aaa.c ggg.c -> 将aaa.c这个文件的名字修改为ggg.c
gec@ubuntu:~$ mv bbb.c test4 -> 将bbb.c这个文件移动到test4这个目录下
test5是不存在的:
gec@ubuntu:~$ mv test test5 -> 将test目录的名字修改为test5。
test6是存在的:
gec@ubuntu:~$ mv test2 test6 -> 将test2这个目录移动到test6下。
3、cat -> 查看文件内容。
用法: cat 需要查看内容的文件路径。
gec@ubuntu:/mnt/hgfs/GZ2057/01 C语言/13/code/fuhao$ cat test.c
#include "my_head.h"
#define ok 0
int main(int argc,char *argv[])
{
int a = 0;
if(a == ok)
gec@ubuntu:/mnt/hgfs/GZ2057/01 C语言/13/code/fuhao$ cat test.c -n (-n:连行号一起打印)
1 #include "my_head.h"
2 #define ok 0
3
4 int main(int argc,char *argv[])
5 {
6 int a = 0;
7 if(a == ok)
4、chmod -> 修改权限。
1)什么是权限?
类型 权限
- rw-rw-r-- 1 gec gec 0 Aug 20 18:09 ggg.c
该权限分开三个权限来看:
rw- 创建者权限user(u) -> 创建者可读可写不可执行。
rw- 组权限group(g) -> 组可读可写不可执行。
r-- 其他人权限other(o) -> 其他人可读不可写不可执行。
权重
r -> read 读权限 4
w -> write 写权限 2
x -> execute 执行权限 1
- -> 代表没有这个位置的权限 0
2)如何修改文件/目录的权限?
单个修改:
公式:chmod (u/g/o)(+/-)(r/w/x) 需要修改的文件路径。
例子1:想给ggg.c这个文件的创建者添加一个执行权限。
chmod u+x ggg.c
例子2:想删除ggg.c这个文件的其他人的读权限。
chmod o-r ggg.c
多个修改:
例子3: 想把ggg.c这个文件的权限修改为 --xr-x-w-
1)计算修改权限之后总权重是多少?
创建者: 0 + 0 + 1 = 1
组: 4 + 0 + 1 = 5
其他人: 0 + 2 + 0 = 2
总权重:152
2)直接使用chmod命令修改权限。
公式:chmod 总权重 需要修改权限的文件的路径
chmod 152 ggg.c
5、tar -> 解压/压缩
在linux下,压缩包都是.gz/.bz2结尾的。
参数:
z: 处理以.gz结尾的压缩包。
j: 处理以.bz2结尾的压缩包。
x: 决定了tar命令是解压命令。
c: 决定了tar命令是压缩的命令。
v: 以可见的方式进行处理 -> 不是必要选项。
f: 不可忽略文件。
-C 路径: 指定解压的路径 例如:想解压到家目录下 -C /home/gec
1)先将内容全部拷贝到一个目录下。
gec@ubuntu:~$ cp 11.c 22.c ggg.c test4/ test5/ test6/ demo -r
2)压缩该目录,变成一个压缩包。
gec@ubuntu:~$ tar zcvf demo.tar.gz demo/
demo/
demo/test4/
demo/test4/bbb.c
demo/ggg.c
demo/22.c
demo/test6/
demo/test6/test2/
demo/test6/test2/aaa.c
demo/test6/test2/kkk.c
demo/test6/test2/bbb.c
demo/11.c
demo/test5/
demo/test5/aaa.c
demo/test5/kkk.c
demo/test5/bbb.c
在当前目录下,会出现一个压缩包叫demo.tar.gz
3)解压压缩包。
gec@ubuntu:~$ tar zxvf demo.tar.gz -C /home/gec
二、文件种类。
1、能不能通过后缀去判断是文件还是目录?
不能。
touch dir -> 这个dir是一个普通文件
mkdir test.txt -> 这个test.txt是一个目录。
结论1: 最准确就是通过"ls -l"去查看文件的类型。(“-”代表普通文件,“d”代表目录)
类型
- rw-rw-r-- 1 gec gec 0 Aug 20 19:19 dir
d rwxrwxr-x 2 gec gec 4096 Aug 20 19:19 test.txt
结论2: 只要通过touch命令来创建,无论叫什么名字,都是一个普通文件。
只要通过mkdir命令来创建,无论叫什么名字,都是一个目录。
2、在linux下,一共有多少种文件类型?
一共有7种。
"-" 普通文件 1.jpg 2.mp3 3.bmp 4.txt 5.doc
"d" 目录文件 dir
"l" 链接文件 类似于windows中的快捷方式
"p" 管道文件 进程之间的通信
"s" 套接字文件 用于网络通信
"c" 字符设备文件 读取设备数据时,是按字节为单位来读取的 -> LCD液晶/触摸屏
"b" 块设备文件 读取设备数据时,按块为单位来读取的 -> U盘/SD卡
3、文件夹与目录是一样的吗?
文件夹是一个容器,文件夹里面的内容永远都会小于这个文件夹的大小。 -> windows
目录是一棵树,目录与目录之间就是一个索引关系。 -> linux
三、文件权限。
1、为什么文件起始权限都是664,目录的起始权限都是775?
rw-rw-r-- 文件都是664,说明文件没有执行权限。
rwxrwxr-x 目录都是775,说明目录有执行权限。
1)文件没有读权限,会怎样?
--wx-wx-wx 1 gec gec 0 Aug 20 19:43 1.c
gec@ubuntu:~$ cat 1.c
cat: 1.c: Permission denied -> 权限拒绝。 -> 但是使用sudo还是可以的。
2)文件没有写权限,会怎样?
-r-xr-xr-x 1 gec gec 19 Aug 20 19:52 1.c
可以使用vi打开文件,但是修改不了内容。 -> 但是使用sudo还是可以的。
3)文件没有执行权限,会怎样?
-rw-rw-rw- 1 gec gec 8600 Aug 20 19:56 1
gec@ubuntu:~$ ./1
bash: ./1: Permission denied
gec@ubuntu:~$ sudo ./1
sudo: ./1: command not found -> 叫大哥过来也没用。
4)目录没有读权限,会怎样?
d-wx-wx-wx 5 gec gec 4096 Aug 20 19:10 demo
gec@ubuntu:~/demo$ ls
ls: cannot open directory '.': Permission denied
gec@ubuntu:~/demo$ sudo ls
11.c 22.c ggg.c test4 test5 test6
5)目录没有写权限,会怎样?
dr-xr-xr-x 5 gec gec 4096 Aug 20 20:02 demo
gec@ubuntu:~/demo$ touch kkk.c
touch: cannot touch 'kkk.c': Permission denied
gec@ubuntu:~/demo$ sudo touch kkk.c -> 但是使用sudo还是可以的。
6)目录没有执行权限,会怎样?
切换不进去,叫大哥过来也没用。
四、文件/目录起始权限都是与系统中"umask"有关。
1、什么是umask?
其实umask就是影响着文件/目录起始权限的一个数字,这个数字可以通过用户去修改它。
2、在linux下,如何查看umask值?
gec@ubuntu:~$ umask
0002 -> 当前系统中的umask值。
0 -> 第一个0属于无效位。
002 -> 后面三个数字才是真正的umask的值。
3、umask值与文件起始权限有什么关系?
公式:
文件起始权限 = 666 - umask = 666 - 002 = 664
rw- rw- rw- rw- rw- rw-
- --- --- -w- - --- --- --x
================== =================
rw- rw- r-- rw- rw- rw-
目录起始权限 = 777 - umask = 777 - 002 = 775
rwx rwx rwx
- --- --- -w-
===================
rwx rwx r-x
4、修改umask的方法。
1)临时修改。 -> 重启终端无效。
gec@ubuntu:~$ umask 0000
gec@ubuntu:~$ umask
0000
gec@ubuntu:~$ touch ggy.c
gec@ubuntu:~$ ls -l ggy.c
-rw-rw-rw- 1 gec gec 0 Aug 20 20:27 ggy.c (666-000=666)
gec@ubuntu:~$
2)永久修改。
思路:其实系统打开终端时,会默认先执行一个脚本文件:~/.bashrc,我们只需要将修改umask的命令写入到脚本中,再生效脚本,那么每一次打开终端就会修改了。
第一步:先打开脚本文件。
gec@ubuntu:~$ gedit /home/gec/.bashrc
第二步:找到文件最末尾的地方,添加以下的内容。
umask 0000
===========================================
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi ->文件末尾
umask 0000 -> 添加这句话
===========================================
第三步: 保存退出
第四步: 重启生效脚本。 / 重启终端
gec@ubuntu:~$ source /home/gec/.bashrc
3)在程序中修改umask的值,不会影响到系统中的umask。 -> umask() -> man 3 umask
头文件:#include <sys/stat.h>
原型:
mode_t umask(mode_t cmask);
cmask: 需要修改的umask的值。 -> 也就是说如果想修改为0000,你只需要"umask(0000)"
返回值:设置过的umask的值。
========================执行前=================
gec@ubuntu:/mnt/hgfs/GZ2057/02 linux基础/02/code$ umask
0002
========================执行时==================
#include <sys/stat.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
/* 1. 当前的umask就是系统的umask*/
system("umask"); //0002 这个system()函数功能就是在程序中执行linux命令。
/* 2. 在程序中设置umask的值 */
umask(0000); //只是在程序中修改,不会影响到系统的umask的值。
system("umask"); //0000
system("mkdir /home/gec/ggy_test"); //777-000=777 由于程序中已经修改为000.所以使用程序中的000
return 0;
}
========================执行后=================
gec@ubuntu:/mnt/hgfs/GZ2057/02 linux基础/02/code$ umask
0002
五、linux根目录存放着什么文件?
gec@ubuntu:/$ ls
bin cdrom etc initrd.img lib32 libx32 media opt root sbin srv tmp var
boot dev home lib lib64 lost+found mnt proc run snap sys usr vmlinuz
常用目录:
bin:存放着常用的linux命令或者可执行程序。
etc:配置文件。
lib:库文件。
root:超级用户的家目录
sbin:只有超级用户才能使用的命令。
boot:系统镜像文件。
memtest86+_multiboot.bin memtest86+.bin -> uboot引导程序。
vmlinuz-4.10.0-28-generic -> kernel内核镜像。
initrd.img-4.10.0-28-generic -> fs文件系统。
dev:硬件设备的驱动文件。
home:普通用户家目录的所在地。
mnt:挂载目录 (共享目录)
proc:进程的资源
usr:第三方安装程序的所在地
/usr/bin -> 第三方程序的可执行程序。
/usr/include -> 第三方程序的头文件。
/usr/lib -> 第三方程序的库文件。
/usr/share -> 第三方程序的帮助文档。
六、环境变量。
1、什么是环境变量?
就是系统中的一些属性,例如:我想回家目录,我们会写"cd"就可以,为什么"cd"可以直接回家,因为linux的环境变量中已经写好了回家就会默认回到/home/gec。换句话说,当我们需要寻找某些东西,就会去环境变量中寻找。
2、如何查看系统中环境变量?
USER、PATH、PWD、HOME、OLDPWD都是环境变量。
gec@ubuntu:~$ env
USER=gec -> 用户名,为什么输入whoami会打印gec出来,因为在环境变量中,我的名字就是gec。
PWD=/home/gec -> 当前所在的路径 为什么输入pwd会打印当前的工作。
HOME=/home/gec -> 解析了为什么输入cd会直接回家,因为输入会默认切换到HOME环境变量所在地。
OLDPWD=/var -> 为什么输入cd -会回到刚刚去过的路径,因为在环境变量下,刚刚去过的路径保存在OLDPWD下。
PATH=/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin -> 可执行程序的路径
3、分析PATH这个环境变量。
PATH=/home/gec/bin:
/home/gec/.local/bin:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games:
/snap/bin:
/usr/local/arm/5.4.0/usr/bin
例子1: 我们都知道,现在在任何的路径下使用ls这个命令,但是我们发送ls这个命令是在/bin,为什么我们执行ls时,不需要指出ls这个程序的路径?执行时候为什么不是:"/bin/ls"。
回答:因为ls是/bin目录下的,而/bin目录是属于环境变量PATH中一个路径,所以在使用ls时,其实系统就会去环境变量PATH中所有路径中寻找有没有ls这个命令。结果在bin/找到了,就可以在任何的路径下使用ls。
例子2: 编译完一个程序之后,如何执行?
gec@ubuntu:~$ ./hello -> 指定执行当前目录下的hello这个程序,所以一定要在当前目录下找到了这个hello才能正常执行。
helloworld!
gec@ubuntu:~$ hello
hello: command not found
如果直接写hello,不会在当前目录下寻找,而是去环境变量下寻找,结果没有找到,所以执行失败。
4、环境变量的使用。
假设当前目录下有一个文件叫hello,我想在任何的路径下都可以直接输入hello,就可以得到结果。
===========================================
做法一:把hello这个程序拷贝到/bin。
gec@ubuntu:~$ sudo cp hello /bin
接下来,就可以在任何的路径下使用"hello"。
===========================================
做法二:把hello所在的路径"/home/gec"添加到环境变量PATH中。
添加之前:
gec@ubuntu:~$ echo $PATH
/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin
添加路径的命令:
gec@ubuntu:~$ export PATH=$PATH:/home/gec
添加之后:
gec@ubuntu:~$ echo $PATH
/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin:/home/gec
接下来,就可以在任何的路径下使用"hello",因为在使用hello在环境变量PATH中/home/gec找到了hello。
练习:自己写一个程序print_name,要求这个程序在放在家目录下的一个project目录下,这个程序的功能就是可以打印自己名字的缩写,要求可以永久在任何的路径下输入"print_name",就可以得到自己名字的缩写。
1)在家目录先创建一个名字叫project目录。
cd
mkdir project
2)在project目录下创建一个print_name.c,然后编译程序。
------------------------------
#include <stdio.h>
int main(int argc,char *argv[])
{
printf("ggy\n");
return 0;
}
-------------------------------
3)编译程序,生成一个名字为print_name的可执行程序。
gec@ubuntu:~/project$ gcc print_name.c -o print_name
4)打开脚本文件。
gedit ~/.bashrc
5)在文件末尾添加以下的这句话。
export PATH=$PATH:/home/gec/project -> 下次寻找文件时,也会在/home/gec/project寻找。
6)生效该脚本。
source ~/.bashrc
7)可以在任何的路径下使用print_name
gec@ubuntu:~/project$ print_name
ggy
5、万一把环境变量弄丢了,怎么办?
1)不要慌。
2)直接输入: export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin -> 临时修改。
3)打开脚本: gedit ~/.bashrc
4)修改回脚本的内容:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin -> 永久修改。
5)重启终端。
七、命令行功能。
1、可以补齐linux命令与文件名。
1)补齐文件名。
gec@ubuntu:~$ cd D -> 按两下Tab键
Desktop/ Documents/ Downloads/ -> 所有以D开头的目录都列出来。
gec@ubuntu:~$ cd Do -> 按两下Tab键
Documents/ Downloads/ -> 所有以Do开头的目录都列出来。
gec@ubuntu:~$ cd Doc -> 按一下Tab键
gec@ubuntu:~$ cd Documents/ -> 自动补齐
2)补齐命令。
gec@ubuntu:~$ mk -> 按两下Tab键
mkdir mkfontscale mkfs.ext3 mkfs.msdos mkisofs mkntfs mkzftree
mkdosfs mkfs mkfs.ext4 -> 将全部mk开头的命令都列出来。
gec@ubuntu:~$ mkd -> 按两下Tab键
mkdir mkdosfs -> 将全部mkd开头的命令都列出来。
gec@ubuntu:~$ mkdi -> 按一下Tab键
gec@ubuntu:~$ mkdir -> 自动补齐
2、记忆已经输入过的命令。
使用方向键来控制: ↑:上一条命令 ↓:下一条命令。
这些命令都是存放在一个文件中: ~/.bash_history
3、给命令取别名。
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias c='clear'
alias p='pwd'