目录与路径:
切换目录:cd(change directory)
特殊目录:
. 代表此层目录
.. 代表上一层目录
- 代表上一个工作目录
~ 代表使用者所在的家目录
cd [相对路径或者绝对路径]
cd .. 切换到上一层目录
cd ~ 切换到该用户的家目录
cd - 切换到上一个目录
(多利用Tab按键进行路径的补全以及修正)
显示当前的目录 :pwd(print working directory)
显示的是当前的工作目录
建立新的目录: mkdir
mkdir [-mp] 目录名称
-m:直接设置文件的权限,不使用unmask的默认权限
-p:将所需要的目录进行递归创建
示例1:在/tmp目录下创建多个目录
cd /tmp
mkdir test =>创建test目录
mkdir -p test1/test2/test3/test4 =>递归创建目录 如果不加-p会报错
示例2:创建权限为rwx--x--x的目录
mkdir -m 711 test2 (如果不加-m选项,权限会按照本机的unmask自动进行创建)
删除目录:rmdir
rmdir [-p] 目录名称
-p:连同上层的“空的”目录也一同删除掉
示例:删除上面创建的所有的test0*文件
rmdir test <=可以直接删除掉
rmdir test1 =>报错(Diretory not empty)
可以用 rmdir -p test1/test2/test3/test4删除掉
不过只能删除空的目录
环境变量PATH:
引入问题:
ls的完整路径是/bin/ls 那么为什么我们在任何目录下面使用ls命令都是不会报错的呢?答案:环境变量
环境变量应该类似于编程语言中的全局变量,我们当然是可以在任意的地方来使用,举例演示
使用echo 来显示环境变量(记得变量前面加上$)
[tom@iZbp12r8eimkkdor4011j3Z ~]$ echo $PATH
/home/tom/.local/bin:/home/tom/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
可以看到环境变量中有/bin目录因此我们可以在任意的地方执行/bin/ls命令(懂了不)
其中,环境变量中间用‘:’冒号进行分割,如果你想将一个目录加入到PATH中只需要加上冒号和目录就行
举例演示:
假设你是root,将ls从/bin/ls移动到/root/ls(mv /bin/ls /root)并且你在/root下,请问
- 你能否直接输入ls执行命令呢
- 如果不能,该怎样才能执行ls命令呢
- 如果想直接输入ls就执行,应该怎样操作呢
su root
mv /bin/ls /root
#将/bin/ls 移动到root目录下面
此时无论你在哪一个目录下输入ls都是不能执行的,因为/root不在PATH中,虽然/bin在PATH中,但是下面的文件ls不是被你移动到/root下面了吗,因此不能直接执行ls命令
那么我们应该怎样执行ls的命令呢?(注意ls已经移动到/root下面了哈)
1.绝对路径 /root/ls
2.相对路径 ./root
我们可以使用绝对或者想对路径来执行ls命令,但是我觉得有点麻烦,我就想直接输入ls命令来执行,怎么做到呢?这就体现到了环境变量的作用了
我们可以将/root加入到PATH中,这样就好了
PATH="${PATH}:/root"
前面提到过,路径都是用:进行分隔,所以我们并没有改变之前的变量,而仅仅只是加入了:/root
相信你应该大致了解了环境变量的意义了
最后,请将ls移动回去
mv /root/ls /bin
文件与目录管理:
目录与文件的查看:ls
ls [-aAdfFhilnrRst] 文件名或者目录
常用:
ls -a :显示全部的文件,包括隐藏文件
ls -d :仅仅列出目录本身,而不是目录中的文件数据
ls -l :显示详细的文件信息(包括执行权限和属性等数据) ll 就是 ls -l的简写
文件的复制:cp (copy)
cp -[option] 源文件 目标文件
cp -[option] source1 source2 source3 ....directory (将目标目录写到最后!)
-a:全部权限,all都复制过去
-i:若目标文件已经存在,覆盖时候会先进行询问
-p:连同文件的属性,权限都复制过去,而不是使用默认的属性
-r:进行递归复制,用于目录的复制
示例:切换到/tmp 将/var/log/wtmp 复制到/tmp观察属性
cd /tmp
[root@iZbp12r8eimkkdor4011j3Z tmp]# cp /var/log/wtmp .
[root@iZbp12r8eimkkdor4011j3Z tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 45696 Dec 22 09:04 /var/log/wtmp
-rw-r--r--. 1 root root 45696 Dec 22 09:39 wtmp
我们可以发现他们两个的权限是不同的,甚至是创建的时间都不一样,如果我们想要完全进行复制
[root@iZbp12r8eimkkdor4011j3Z tmp]# cp -a /var/log/wtmp wtmp_2
[root@iZbp12r8eimkkdor4011j3Z tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 45696 Dec 22 09:04 /var/log/wtmp
-rw-rw-r--. 1 root utmp 45696 Dec 22 09:04 wtmp_2
使用-a选项,发现两个文件一模一样
删除文件或者是目录:rm(remove)
rm [-fir] 文件或者是目录
-f: force,强制执行,忽略不存在的文件名,不会出现警告信息
-i: 交互模式,删除前会询问是否删除 y:yes n:no
-r:递归删除,用于删除目录
#示例1:将/tmp/下面所有的hello为前缀的文件删除掉
rm -i hello*
#示例2:删除掉/tmp/etc
rm -r /tmp/etc
清理Linux当前目录下面的所有的的垃圾文件:rm -rf /*
-rf :rubbish file
执行了这条命令之后,你就拥有了一次装机的机会
移动文件、目录,或是重命名 mv (move)
mv [-fiu] 源文件 destination
mv [options] source1 source1 source2 source3 ....directory =>移动多个文件到指定目录下面
-f :force强制执行,如果文件已经存在,不会询问而直接进行覆盖
-i :如果目标文件已经存在,会进行询问是否进行覆盖
-u :如果文件存在,并且source比较新才会更新
#示例1:将/tmp/hellodf.c 改名为hello.c
cd /tmp
mv hellodf.c hello.c
#示例2:将/root下的多个文件移动到/tmp下
cd /root
mv hello1.txt hello2.txt hello3.txt /tmp
cd /tmp(切换到/tmp)
ls hello*(显示前缀为hello的文件)
文件内容的查看(cat,more,less)
cat(concatenate)
cat [-AbEnTv]
-n:打印行号,空白行也会打印行号
#示例1:查看/tmp/hello.txt文件的内容,打印行号
cat -n /tmp/hello.txt
tac(cat倒着写,那么打印的内容也是从最后打印到首行的)
more(可一页一页翻动)
more 文件
- 空格键(space):向下翻一页
- Enter:向下翻一行
- /字符串:在该文件中向下查找这个关键词
- :f :显示文件名和目前显示的行号
- q : 离开more,不再显示文件的内容
- b : 往回进行翻页
#示例:查看/etc/man_db.conf 内容并查找MANPATH字符
more /etc/man_db.conf
#
#
#
#
#
...........
/MANPATH =>按下 / 反斜杠就会等待输入,输入MANPATH后进行查找
less
- 空格键:向下翻页
- 【pagedown】向下翻一页
- 【pageup】向上翻一页
- /字符串 : 向下查找字符串
- ?字符串 : 向上查找字符串
- g:回到文件的第一行
- G:到达文件的最后一行
- q:离开less这个程序
文件数据的截取
head(取出来文件的前几行)
head [-n number] 文件 =>显示文件的前number行内容
-n : 后面接上数字,代表显示几行的意思
#如果你不加-n选项,默认的是显示前十行的内容
#示例1:显示hello.txt的前16行
head -n 16 hello.txt
#示例2:除了后100行的内容不打印之外,其他的都打印
head -n -100 hello.txt
tail(取出来文件的后面几行)
tail [-n number] 文件
-n:同head
#示例:显示后16行内容
tail -n 16 hello.txt
#示例2:除了前100行外都打印
tail -n +100 hello.txt
如果我想要打印中间段落内容,而不仅仅是头或者尾巴呢?
#示例:如果想要打印11-20行的内容
1.先取文件的前20行,再取出来其中的后10行就是11-20行的内容了
head -n 20 hello.txt | tail -n 10
如果同时想要列出来行号进行验证:
cat -n hello.txt | head -n 20 | tail -n 10
创建文件touch
touch 文件名 =>创建一个空目录
创建时候更改时间请自行百度,不在此赘述
文件的目录默认权限和隐藏的属性
文件的默认权限 umask
umask是指在创建文件或者目录的时候系统赋予的默认的权限,可以在终端输入umask进行查看
[root@iZbp12r8eimkkdor4011j3Z tmp]# umask
0022 ==>与权限有关的是后面的三个数字
[root@iZbp12r8eimkkdor4011j3Z tmp]# umask -S
u=rwx,g=rx,o=rx
umask 后面的数字代表你需要拿掉的权限 022
代表用户组和other需要拿掉写的权限
观察文件的类型 file
[root@iZbp12r8eimkkdor4011j3Z ~]# file ~/.bashrc
/root/.bashrc: ASCII text =>ASCII 的文本文件
[root@iZbp12r8eimkkdor4011j3Z ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=87e17c1d9b2e20d7e8aeab9115074375eec5e8e1, stripped
可执行文件包含了很多的权限啥的
作用:简单的判断文件的格式是什么,使用tar包的时候可以判断使用的是哪一种的压缩格式
命令与文件的查找
脚本文件的查找which(查找执行文件)
由上面的文章你应该了解执行文件的路径是写在PATH中的,命令是根据【PATH】环境变量所规范的路径去查找文件的文件名
which [-a] command
-a : 将所有的PATH目录中可以找到的命令全部列出,而不仅仅是列出第一个
示例1:查找ifconfig命令的完整文件名
[root@iZbp12r8eimkkdor4011j3Z ~]# which ifconfig
/usr/sbin/ifconfig
示例2:查找which的文件名
[root@iZbp12r8eimkkdor4011j3Z ~]# which which
which ()
{
( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@"
}
文件的查找(不是脚本文件)
whereis(由特定的目录中查找文件)
特点:查询速度比较的快,因为它只会查询几个特定的目录而不是全部的目录
whereis [-bmsu] 文件或者是目录名
-b : 仅仅查找二进制文件
-m : 仅仅找在说明文件manual路径下的文件
-s : 仅仅找源文件
#示例1:找ifconfig
[root@iZbp12r8eimkkdor4011j3Z ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
#示例2:找跟passwd有关的【说明文件】文件名(man page)
[root@iZbp12r8eimkkdor4011j3Z ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
locate / updatedb
优点:使用简单,输入文件的部分名称就能够得到结果(如果记不清名字,是一个很好的方式)
因为locate寻找的是自己的数据库,不用读取硬盘,但是你需要更新一下
updatedb:更新数据库的内容
locate [-ir] keyword
-i: 忽略大小写的差异
-c: 不输出文件名,仅仅输出查找到的文件的数量
-l: 仅仅输出几行的意思
-s: 输出所使用的数据库文件的相关的信息
示例1:找出系统中与passwd有关的文件,并且仅仅输出5个
locate -l 5 passwd
find
find [PATH] [option] [action]
#find指令 将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端
#-name <查询方式> 按照指定的文件名查找模式查找文件
#-user <用户名> 查找属于指定用户名所有文件
#-size <文件大小> 按照指定的文件大小查找文件
#按文件名,根据名称查找/home目录下的hello.txt文件
find /home -name hello.txt
#按拥有者,查找/opt目录下,用户名称为root的文件
find /opt -user root
#查找整个linux系统下大于20M的文件(+n 大于 -n 小于 n 等于)
find / -size +20M
#查询根目录下,所有后缀为.txt的文件
find / -name *.txt
权限与命令之间的关系
一、用户能够进入到目录成为可工作目录的基本权限?
- 使用cd命令切换到目录
- 目录需要的权限:既然是切换到这个目录,至少是需要x的权限
- 如果想查看目录下的文件名(ls)呢?因为文件就是目录的内容,查看文件名就是读取,因此权限至少是rx
二、用户在某个目录中读取文件的基本权限?
- 使用命令:more less cat 等
- 目录需要的权限:x
- 文件需要的基本权限:r
三、用户修改文件所需要的基本权限?
- 使用命令:使用vi编辑器进行更改
- 目录所需要的权限:x
- 文件所需要的权限:r,w
四、用户可以创建一个文件的基本权限?
- 目录所需要的权限:w.x 一般目录都需要有x权限 w:文件就是目录的内容,你新增了一个就相当于改写了目录的内容
五、用户进入某个目录并执行目录下的命令?
- 目录所需要的权限x
- 文件所需要的权限 x
样例:让一个用户tom能进行【cp /dir1/file1 /dir2】命令, dir1 file1 dir2 的最小需要的权限是什么?
执行cp时候,tom至少能够读取源文件并且写入目标文件,因此最小所需要的权限:
- dir1 : x =>注意是cp 而不是mv 如果是mv就需要w的权限了
- file1 : r
- dir2 : w x (往这个目录下写入了一个新的文件)
想要了解更多请移步上一篇博客