Linux期末复习3(文件与目录管理)

SHELL编程练习

文件的属性和权限

基本文件操作练习

高级文件操作练习

文件和目录管理

目录与路径:

切换目录: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 (往这个目录下写入了一个新的文件)

想要了解更多请移步上一篇博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值