Linux目录与文件操作
1 linux 目录结构
bin: 存放二进制可执行文件(ls,cat,mkdir等)
boot: 存放用于系统引导时使用的各种文件
dev: 用于存放设备文件
etc:存放系统配置文件 /etc/profile, /etc/passwd ,/etc/shadow
home: 存放所有用户(除了root)文件的根目录
lib:存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt:系统管理员安装临时文件系统的安装点
opt:额外安装的可选应用程序包所放置的位置
proc:虚拟文件系统,存放当前内存的映射
root:超级用户目录
sbin:存放系统管理命令
tmp:用于存放各种临时文件
usr:用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录
/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;
= windows Program Files
var:用于存放运行时需要改变数据的文件
tmp : 临时目录 可以存放一些不重要的文件
2 建立文件和目录
2.1 建立目录:mkdir
命令格式:
mkdir [-参数] 目录
命令功能:
通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且,同一目录下所创建的文件夹(目录)不能相同(区分大小写)。
参数:
-m:--mode=模式,设定权限<模式> (类似 chmod),数字类型;
-p:--parents 可以是个路径名, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;
案例:
1.创建目录
[root@localhost ~]# mkdir d1
[root@localhost ~]# ll | grep d1
drwxr-xr-x. 2 root root 6 8月 23 00:43 d1
2.创建目录并指定权限
[root@localhost ~]# mkdir -m 700 d2
[root@localhost ~]# ll | grep d2
drwx------. 2 root root 6 8月 23 00:44 d2
3.创建多级目录
[root@localhost ~]# mkdir -p a/b/c
[root@localhost ~]# ll a
总用量 0
drwxr-xr-x. 3 root root 15 8月 23 00:45 b
[root@localhost ~]# ll a/b
总用量 0
drwxr-xr-x. 2 root root 6 8月 23 00:45 c
2.2 建立一个空文件:touch
命令格式:
touch 文件
命令功能:
创建一个 空文件。
案例:
[root@localhost ~]# touch file5 //创建文件
[root@localhost ~]# ll | grep file5 //查看文件
-rw-r--r--. 1 root root 0 8月 23 00:49 file5
3 移动、复制和删除目录/文件
3.1 移动和重命名:mv
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来移动文件或者目录。
命令格式:
mv [-参数] 源目录或文件 目标文件或目录
命令功能:
视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。
参数:
-b :若需覆盖文件,则覆盖前先行备份。
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
案例:
文件重命名
[root@localhost ~]# ll | grep a //查看文件
drwxr-xr-x. 3 root root 15 8月 23 00:45 a
[root@localhost ~]# mv a d3 | ll | grep d3 //更改文件名,并查看
[root@localhost ~]# ll | grep d3
drwxr-xr-x. 3 root root 15 8月 23 00:45 d3
将新建的 file5 这个文件移动到d3 目录
[root@localhost ~]# mv file5 d3
[root@localhost ~]# cd d3
[root@localhost d3]# ll
总用量 0
drwxr-xr-x. 3 root root 15 8月 23 00:45 b
-rw-r--r--. 1 root root 0 8月 23 00:49 file5
将d3目录移动到d1目录中
[root@localhost ~]# mv d3 d1
[root@localhost ~]# cd d1
[root@localhost d1]# ll
总用量 0
drwxr-xr-x. 3 root root 28 8月 23 17:24 d3
移动同名文件到相同目录,进行备份
[root@localhost ~]# mkdir d4
[root@localhost ~]# touch file4
[root@localhost ~]# mv file4 d4
[root@localhost ~]# touch file4
[root@localhost ~]# mv -i -b file4 d4
mv:是否覆盖"d4/file4"? y
[root@localhost ~]# cd d4
[root@localhost d4]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月 23 17:37 file4
-rw-r--r--. 1 root root 0 8月 23 17:36 file4~
//mv 的 -i 参数起到提示作用 -b 参数备份文件
如果目标文件已经存在,如果当前用户是root 用户,不写 -i 也会提示,而新建的用户,则不会提示。原因在于用户家目录下的.bashrc 文件中配置了别名
当用户是root时,文件中包含以下配置
[root@localhost ~]# cat .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'//当使用这三个命令时,需要覆盖文件时有提示
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
当用户是普通用户时,文件中没有该配置,需要提示时使用-i参数
1如果也想配置,则需要使用vi文本编辑器更改.bashrc文件,写入下面三行代码
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
2然后重新刷新自己的环境变量
source .bashrc
3.2 复制:cp
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。
命令格式:
cp [-参数] 源目录或文件 目标文件或目录
命令功能:
将源文件复制至目标文件,或将多个源文件复制至目标目录。
参数:
-a: –archive 递归复制文件目录,并且复制的文件的属性也一致
-i: –interactive 覆盖前询问
-R:递归处理,将指定目录下的文件及子目录一并处理
案例:
1.复制file3文件为file4
[root@localhost ~]# cp file3 file4
2.复制file3文件到d1目录下
[root@localhost ~]# cp file3 d1 //复制文件
cp:是否覆盖"d1/file3"? y //确认覆盖
[root@localhost ~]# cd d1 //切换目录
[root@localhost d1]# ls //查看目录
d1 d3 d4 file3
[root@localhost d1]# cd ~ //切换目录
[root@localhost ~]# cp -i file3 d1 //复制文件,有提醒
cp:是否覆盖"d1/file3"? y //确认覆盖
[root@localhost ~]# cd d1 //切换目录
[root@localhost d1]# ls //查看目录
d1 d3 d4 file3
3.复制f1目录为f3
[root@localhost ~]# cp -R f1 f3
[root@localhost ~]# ls
anaconda-ks.cfg d1 d4 f2 file1 file3 group
Centos-7.repo d2 f1 f3 file2 file4 log1
4.复制f1目录到d1目录下
[root@localhost ~]# cp -R f1 d1
[root@localhost ~]# cd d1
[root@localhost d1]# ls
d1 d3 d4 f1 file3
4.将d1目录的所有内容复制到f1下
[root@localhost ~]# cp -R d1 f1
[root@localhost ~]# cd f1
[root@localhost f1]# ls
d1
3.3 删除:rm
rm是常用的命令,删除文件与目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。
命令格式:
rm [-参数] 文件或目录
命令功能:
删除一个目录中的一个或多个文件或目录,如果没有使用- r选项,则rm不会删除目录。如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。
参数:
-f: --force 忽略不存在的文件,从不给出提示。
-i:--interactive 进行交互式删除
-r, -R: --recursive 指示rm将参数中列出的全部目录和子目录均递归地删除。
案例:
1.删除a目录(a是目录,目录下有内容,递归删除a目录的内容)
[root@localhost ~]# rm -r a
rm:是否进入目录"a"? y
rm:是否进入目录"a/b"? y
rm:是否删除目录 "a/b/c"?y
rm:是否删除目录 "a/b"?y
rm:是否删除目录 "a"?y
2.强制并递归删除d1目录的内容
[root@localhost ~]# rm -rf d1
[root@localhost ~]# ls
anaconda-ks.cfg d2 f1 f3 file2 file4 log1
Centos-7.repo d4 f2 file1 file3 group
rm -rf /etc(不要尝试)
4 改变文档所有权、文档权限
4.1 改变文档的所有权:chown(change own)
chown 将指定文件的拥有者改为指定的用户或组
用户可以是用户名或者用户ID;组可以是组名或者组ID
命令格式:
chown [选项]... [所有者][:[组]] 文件或目录...
命令功能:
通过chown改变文件的拥有者和群组。
在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。
普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。
参数:
-R 处理指定目录以及其子目录下的所有文件
案例:
1.修改group的用户与组,用户与组之间使用:分隔
[root@localhost ~]# chown user3:user3 group
[root@localhost ~]# ll
总用量 28
-rw-------. 1 root root 1241 8月 19 19:22 anaconda-ks.cfg
…………
-rw-r--r--. 1 user3 user3 644 8月 23 19:50 group
-rw-r--r--. 1 root root 82 8月 22 05:18 log1
2.修改file4的用户与组,指定一半(user3:)都改了
[root@localhost ~]# chown user3: file4
[root@localhost ~]# ll
总用量 28
-rw-------. 1 root root 1241 8月 19 19:22 anaconda-ks.cfg
…………
-rw-r--r--. 1 user3 user3 678 8月 23 19:03 file4
-rw-r--r--. 1 user3 user3 644 8月 23 19:50 group
-rw-r--r--. 1 root root 82 8月 22 05:18 log1
3.只修改组
[root@localhost ~]# chown :user3 file3
[root@localhost ~]# ll
总用量 28
-rw-------. 1 root root 1241 8月 19 19:22 anaconda-ks.cfg
…………
-rw-r--r--. 1 user3 user3 678 8月 23 19:03 file4
4.2 改变文件的所属组:chgrp
在Linux系统里,文件或目录的权限的掌控以拥有者及所属群组来管理。可以使用chgrp 指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以。
修改所属的组,组名必须在/etc/group中存在
命令格式:
chgrp [选项] [组] 文件或目录
命令功能:
chgrp命令可采用群组名称或群组识别码的方式改变文件或目录的所属群组。使用权限是超级用户。
参数:
-R 处理指定目录以及其子目录下的所有文件
案例:
1.修改file5的所属组为group1
[root@localhost ~]# chgrp group1 file3
[root@localhost ~]# ll
总用量 28
-rw-------. 1 root root 1241 8月 19 19:22 anaconda-ks.cfg
…………
-rw-r--r--. 1 root group1 678 8月 22 23:11 file3
2.改变指定目录以及其子目录下的所有文件的群组属性
[root@localhost ~]# cp -R /etc/ ./
[root@localhost ~]# ll
总用量 24
-rw-------. 1 root root 1293 5月 30 12:28 anaconda-ks.cfg
drwxr-xr-x. 74 root root 8192 5月 31 01:46 etc
-rw-r--r--. 1 user4 group1 1304 5月 31 01:37 file1
-rw-r--r--. 1 root user4 1304 5月 31 01:37 file2
[root@localhost ~]# chgrp group1 etc/
[root@localhost ~]# ll
总用量 24
-rw-------. 1 root root 1293 5月 30 12:28 anaconda-ks.cfg
drwxr-xr-x. 74 root group1 8192 5月 31 01:46 etc
-rw-r--r--. 1 user4 group1 1304 5月 31 01:37 file1
-rw-r--r--. 1 root user4 1304 5月 31 01:37 file2
[root@localhost ~]# cd etc/
[root@localhost etc]# ll
总用量 1036
-rw-r--r--. 1 root root 16 5月 31 01:46 adjtime
-rw-r--r--. 1 root root 1518 5月 31 01:46 aliases
-rw-r--r--. 1 root root 12288 5月 31 01:46 aliases.db
drwxr-xr-x. 2 root root 236 5月 31 01:46 alternatives
-rw-------. 1 root root 541 5月 31 01:46 anacrontab
-rw-r--r--. 1 root root 55 5月 31 01:46 asound.conf
drwxr-x---. 3 root root 43 5月 31 01:46 audisp
drwxr-x---. 3 root root 83 5月 31 01:46 audit
.....其他的略
[root@localhost etc]# cd ../
[root@localhost ~]# chgrp -R group1 etc
[root@localhost ~]# cd etc/
[root@localhost etc]# ll
总用量 1036
-rw-r--r--. 1 root group1 16 5月 31 01:46 adjtime
-rw-r--r--. 1 root group1 1518 5月 31 01:46 aliases
-rw-r--r--. 1 root group1 12288 5月 31 01:46 aliases.db
drwxr-xr-x. 2 root group1 236 5月 31 01:46 alternatives
..........其他的略
执行效果相同:
chgrp -R group1 d1
chown -R :zwm d1
4.3 改变文档权限:chmod
chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
4.3.1 符号类型改变档案权限
案例:
1)设置文件拥有者(读、写、执行权),组拥有(读、写、执行权),其他拥有者组拥有(读、写、执行权)
[root@localhost ~]# ll | grep file2
-rw-r--r--. 1 root root 364 8月 22 23:17 file2
[root@localhost ~]# chmod u=rwx,g=rwx,o=rwx file2
[root@localhost ~]# ll | grep file2
-rwxrwxrwx. 1 root root 364 8月 22 23:17 file2
2)给 文件所有用户组加可执行权
[root@localhost ~]# ll | grep file4
-rw-r--r--. 1 user3 user3 678 8月 23 19:03 file4
[root@localhost ~]# chmod a+x file4
[root@localhost ~]# ll | grep file4
-rwxr-xr-x. 1 user3 user3 678 8月 23 19:03 file4
4.3.2 数字类型改变档案权限
命令格式:
chmod [参数]三位权限数字 文件或目录
参数:
-R 处理指定目录以及其子目录下的所有文件
数字与字符对应关系如下:
r=4,w=2,x=1
若要rwx属性则4+2+1=7
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
案例:
1)设置文件拥有者(读、写、执行权),组拥有(读、执行权),其他拥有者组拥有(读权)
[root@localhost ~]# chmod 754 file3
[root@localhost ~]# ll | grep file3
-rwxr-xr--. 1 root group1 678 8月 22 23:11 file3
2)设置目录及其子目录 拥有者(读、写、执行权),组拥有(读、写、执行权),其他没有权限
[root@localhost ~]# chmod -R 770 etc
[root@localhost ~]# ll etc
总用量 1056
-rwxrwx---. 1 root group1 16 8月 23 20:16 adjtime
-rwxrwx---. 1 root group1 1518 8月 23 20:16 aliases
…………
drwxrwx---. 2 root group1 236 8月 23 20:16 alternatives
-rwxrwx---. 1 root group1 541 8月 23 20:16 anacrontab
…………
5 输入输出重定向 和 管道
对于任何一条 linux 命令执行,它会是这样一个过程:
一个命令执行了: 先有一个输入:输入可以从键盘,也可以从文件得到。
命令执行完成:成功了,
会把成功结果输出到屏幕:standard output默认是屏幕
命令执行有错误:
会把错误也输出到屏幕上面:standard error默认也是指的屏幕
三种输入输出的代码分别是:
1)标准输入(stdin);代码为 0 ;
2)标准输出(stdout):代码为 1 ;
3)错误输出(stderr):代码为 2 ;
标准重定向符号
> 输出重定向到一个文件或设备 覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
标准错误重定向符号
2> 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 b-shell
2>> 将一个标准错误输出重定向到一个文件或设备 追加到原来的文件
2>&1 将一个标准错误输出重定向到标准输出 、
5.1 输出重定向
将标准输出到屏幕的信息重定向输出到指定文件内。
案例:
1.输出重定向
cat file2 > log2 //将内容输出到log2文件中,覆盖
cat file2 >> log2 //将内容输出到log2文件中,追加
2.输出与错误重定向
//将错误输出到log3中,前提file21文件不存在
[root@localhost ~]# cat file21 2> log3
[root@localhost ~]# cat log3
cat: file21: 没有那个文件或目录
cat file2 >> log4 2>&1 //将输出与错误指向同一个文件,输出测试
cat file21 >> log4 2>&1 //将输出与错误指向同一个文件,错误测试
//将错误与输出指向不同的文件
//输出指向log5
//错误指向log6
cat file21 >> log5 2>log6
5.2 输入重定向:cat
将标准从键盘输入改为从文件输入。
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从
标准输入读取内容并显示,它常与重定向符号配合使用。
3.输入重定向
[root@localhost ~]# cat << eof
> 12
> 34
> 56
> eof
12
34
56
[root@localhost ~]#
5.3 管道符号:|
将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
command1正确输出,作为command2的输入,然后comand2的输出作为,comand3的输入,comand3输出就会直接显示在屏幕上面了。
通过管道之后:comand1,comand2的正确输出不显示在屏幕上面。
注意:
1)管道命令只处理前一个命令正确输出,不处理错误输出。
2)管道命令右边命令,必须能够接收标准输入流命令才行。
案例:
1.查看passwd文件内容,并只显示含有user1的信息
[root@localhost ~]# cat /etc/passwd | grep user1
user1:x:1000:1003:2019-08-20这是一个普通用户:/home/user1:/bin/bash
user11:x:1004:1007::/home/user11:/bin/bash
user12:x:1005:1008:普通的用户:/home/user12:/bin/bash
user13:x:1006:1000:这个组属于1000:/home/user13:/bin/bash
sysuser14:x:997:993::/home/sysuser14:/bin/bash