Linux目录及文件的基本操作
Linux文件和目录操作命令
1. 目录从/开始
绝对目录:从根目录下开始的路径 cd /home/ap/was/AppServer/profiles/Dmgr01
相对目录:不从根目录开始的路径 cd bin
当前目录:./
2. linux命令提示符介绍:
[root@localhost ~]#
root #用户
@ #at 在
localhost #主机名
~ #家目录
# #超级用户
$ #普通用户
3. linux帮助命令
man
--help
4. pwd #当前目录查看命令
5. 切换目录
cd ~ #进入用户家目录 或者直接 cd 回车
cd - #回到先前的目录
cd .. #返回上一级目录
6. tree #以树状结构显示目录下的内容
使用之前先检查是否安装了tree命令,如果没有安装<== yum install tree -y
为了防止树状结构乱码:LANG=en_US.UTF-8
常用参数选项:
-a 显示所有文件,包括隐藏文件(以.开头的文件)
-d 只显示目录
-f 显示每个文件的全路径
-L 参数后接数字,表示查看目录的层数,不带-L选项默认显示所有层数。
-i 不显示树状,常与-f参数配合使用
-F 后面可以加管道,来grep
基础范例:
-bash-4.1$ tree -L 1 #<== -L 参数后接数字,表示查看目录的层数,不带-L选项默认显示所有层数。
-bash-4.1$ tree -d /etc/ #<== -d 参数表示只显示目录
-bash-4.1$ tree -L 1 -f /boot/ #<== -f 显示内容的完美路径
-bash-4.1$ tree -L 1 -fi /boot/ #<== -i 不显示树枝
/boot
/boot/config-2.6.32-504.el6.x86_64
/boot/efi
/boot/grub
/boot/initramfs-2.6.32-504.el6.x86_64.img
/boot/initrd-2.6.32-504.el6.x86_64kdump.img
/boot/lost+found
/boot/symvers-2.6.32-504.el6.x86_64.gz
/boot/System.map-2.6.32-504.el6.x86_64
/boot/vmlinuz-2.6.32-504.el6.x86_64
-bash-4.1$ tree -L 1 -F /boot/ | grep /$ #<==过滤以斜线结尾的所有内容。
/boot/
├── efi/
├── grub/
├── lost+found/
7. mkidr #创建目录
参数选项:
-p 递归创建目录
-v 显示创建的过程
-m 设置新创建目录的权限
基础范例:
mkdir -m 333 dir2 #<== 新创建目录的权限333
mkdir -p /home/ap #<== 递归创建目录
技巧性案例:
同时创建多个目录及多级目录?
-bash-4.1$ mkdir -pv oldboy/{dir1,dir2}/{dir2_1,dir2_2}
-bash-4.1$ tree -d oldboy/
oldboy/
├── dir1
│ ├── dir2_1
│ └── dir2_2
└── dir2
├── dir2_1
└── dir2_2
-bash-4.1$ mkdir -p test/dir{1..5} old/{a..g}
扩展知识:
-bash-4.1$ echo {B,C} #<==会把BC输出到屏幕
B C
-bash-4.1$ echo A{B,C}
AB AC
-bash-4.1$ echo A{,C} #<==如果逗号前面什么都没有,可以认为是一个空字符
A AC
8. touch :创建空文件或者改变文件的时间戳属性
常用参数选项:
-a 更改文件的最后访问时间和最后改变文件状态的时间
-m 更改文件的最后修改时间和最后改变文件状态的时间
-d 指定文件最后修改时间和最后访问时间
-t 使用年月日时分.秒的方式更改文件的时间属性
范例:创建文件
-bash-4.1$ touch a.txt ##创建文件
-bash-4.1$ touch a{1..4}.txt
案例:更改文件的时间戳属性
[root@mylinux home]# stat a.txt 《==查看文件的时间戳属性
File: `a.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 530402 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-08 00:07:03.412940976 +0800 《==最后访问文件时间
Modify: 2020-03-08 00:07:03.412940976 +0800 《==最后修改文件时间
Change: 2020-03-08 00:07:03.412940976 +0800 《==最后改变文件状态的时间
[root@mylinux home]# touch -d 20200101 a.txt 《==指定文件最后修改时间和最后访问时间为20200101
[root@mylinux home]# stat a.txt
File: `a.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 530402 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-01-01 00:00:00.000000000 +0800
Modify: 2020-01-01 00:00:00.000000000 +0800
Change: 2020-03-08 00:16:56.074437951 +0800
[root@mylinux home]# touch -t 202002021230.03 a.txt 《== -t 使用年月日时分.秒的方式更改文件的时间属性
[root@mylinux home]# stat a.txt
File: `a.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 530402 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-02 12:30:03.000000000 +0800
Modify: 2020-02-02 12:30:03.000000000 +0800
Change: 2020-03-08 00:25:27.280949397 +0800
9. ls :显示目录下的内容及相关属性信息常用
参数选项:
-l 使用长格式列出文件与目录信息 ※※※
-a 显示目录下的所有文件,包括以"."字符开始的隐藏文件 ※※※
-t 根据文件的最后修改时间排序,默认是以文件名排序 ※※※
-r 相反次序排序 ※※※
-F 在条目后加上文件类型的指定符号(/、=、@、|、*,其中的一个) ※※※
-p 只在目录后加"/" ※※※
-i 显示inode节点信息 ※※※
-d 当遇到目录时,列出目录本身而非目录内的文件,并且并不跟随符号链接 ※※※
-h 以人类可读的方式显示文件或目录大小,如1kb,234mb,2gb ※※※
-A 列出所有文件,包括隐藏文件,但不包括"." "..",这两个目录
-S 根据文件大小排序
-R 递归列出所有子目录
-x 逐行列出项目
-X 根据扩展名排序
-c 根据状态改变时间排序
-u 根据最后访问时间排序
--color=auto 给匹配的关键字加颜色 ※※※
--full-time 以完整的时间格式输出 (个人感觉此类最直观)※※※
--time-style=long-iso 以不同的时间格式输出(不推荐)
--time={atime,ctime} 按不同的时间属性输出,atime表示按访问时间,ctime表示按改变时间,如果不加参数则默认最后修改时间 ※※※
范例一:将目录下面的文件都列出来(含属性与隐藏文件)
[root@dsetl tmp]# ls -al
drwx------ 2 fex 602 4096 Jan 9 11:41 keyring-XoSvfl
范例二:完整的显示文件的修改时间
[root@dsetl tmp]# ls -al --full-time
rwx------ 2 fex 602 4096 2014-01-09 11:41:48.000000000 +0800 .esd-602
范例三:查看文件的最后访问时间
[root@dsetl tmp]#ls -l --full-time --time=atime
范例四:在条目后加上文件类型的指定符号
[root@mylinux home]# ls -F
a.txt was/
※※※ ls命令输出内容解读 ※※※
[root@mylinux home]# ls -lhi
35652793 drwxr-xr-x. 4 was was 4.0K 5月 29 17:37 temp
35652809 -rw-r--r--. 1 was was 9.3K 4月 1 09:22 velocity.log
第一列 i node索引节点,他是文件目录的唯一标识。linux读取文件首先读取这个索引节点。
第二列的第一字符 : 文件类型 -: 普通文件 d:目录
第二列的后面字符 : 文件权限 ,三个为一组
-rw-r--r--. ### r:read w:write x:执行 -代表没有 .selinux相关的东西,查看getenforce
-rw 文件所有者
-r- 与文件所有者同一组的用户的权限
r-- 其他用户
第三列: 文件的硬链接数。文件硬链接是文件的又一个入口。
第四列: 文件属主或用户
第五列: 文件对应的属组或用户组
第六列: 文件的大小
第七八九列 : 最近修改的时间
最后一列: 文件或目录的名字
10. cp #复制文件或目录
常用选项说明:
-p 复制时保持源文件的所有者,权限信息及时间属性
-d 如果复制的源文件是符号链接,那么仅复制符号链接本身,而且保留符号链接所指的目录文件或目录
-r 递归复制目录
-a 相当于pdr ※※※
-i 覆盖已有文件前提示用户确认
-t 默认情况下"cp 源文件 目标",使用-t 可以颠倒顺序,"cp -t 目标 源文件"
范例:cp覆盖文件之前不提示是否覆盖的几种方法 ※※※
[root@mylinux home]# cp a.txt b.txt
cp: overwrite `b.txt'? y 《==提示用户是否覆盖
[root@mylinux home]# which cp
alias cp='cp -i'
/bin/cp
解决办法:※※※
[root@mylinux home]# \cp a.txt b.txt
范例:快速备份文件 ※※※
[root@mylinux home]# cp /etc/yum.repos.d/redhat.repo{,.back}
11. alias 别名:别名的作用:添加一些保护参数,防止人为五操作,把复杂的字符串变成一个简单的字符串
alias #查看系统现有的别名和设置别名
unalias cp #取消cp的别名
alias tail ='tail -fn 500' #设置别名
范例:
[root@mylinux home]# unalias ls #取消ls的别名
[root@mylinux home]# alias ls='ls -l --full-time' #取消ls的别名
[root@mylinux home]# ls
total 4
-rw-r--r--. 1 root root 0 2020-02-02 12:30:03.000000000 +0800 a.txt
-rw-r--r--. 1 root root 0 2020-03-08 01:11:20.519228905 +0800 b.txt
drwx------. 26 was was 4096 2020-03-07 23:43:31.499041527 +0800 was
12. mv #移动或重命名
常用选项说明:
-f 若目标文件已经存在,则不会询问而是直接覆盖
-i 若目标文件已经存在,则会询问覆盖
-n 不覆盖已存在的文件
-t 指定mv的目标目录,适用于移动多个源文件到一个目录的情况,此时目录目录在前,源文件在后,
13. rm #删除
常用选项说明:
-r 强制删除。忽略不存在的文件,不提示确认 ※※※
-i 删除前提示需要确认
-r 递归删除目录及其内容 ※※※
14. rmdir #删除空目录
15. ln #硬链接与软连接
常用选项说明:
-s 创建软连接 ※※※
无参数 创建硬链接 ※※※
硬链接是通过索引节点来进行连接,多个文件执行同一个索引节点,这种情况的文件被称为硬链接。
硬链接(hard link):A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同。
即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响。
每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块被回收。
注:文件和文件名是不同的东西,rm A删除的只是A这个文件名,而A对应的数据块(文件)只有在inode节点链接数减少为0的时候才会被系统回收。
创建命令 语法: ln 源文件 硬链接文件
[root@localhost oldboy]# ln oldboyfile oldboyfile_hard_link
硬链接小结:
1.具有相同inode节点号的多个文件是互为硬链接文件。硬链接文件的inode是相同的。
2.删除硬链接文件或源文件任意之一,文件实体并未被删除。(只是把链接的指向删除了)-------》找回源文件按或硬链接文件 ln oldboyfile_hard_link oldboyfile
3.只有把源文件和源文件对应的所有链接文件删除,文件实体才会被删除。
4.没有链接指向的文件会被系统回收。
5.硬链接文件就是文件的另一个入口,相当于超市的前门后门。
6.可以创建硬链接文件,来防止重要的文件被误删除。
7.可以通过执行命令 “ln 源文件 硬链接文件” ,即创建硬链接。
8.硬链接文件rm 命令删除。
9.硬链接文件相当于文件的入口(相当于超市的前后门)
10.当对应硬链接数量为0(i_link)时,文件就会被回收。i_link的查看方法ls -lhi,查看结果第三列,就是硬链接数量
11.目录的硬链接不允许ln ※※※※※※※※※※※※
软链接(soft link):A是B的软链接(A和B都是文件名),A的目录项中的inode节点号与B的目录项中的inode节点号不相同,
A和B指向的是两个不同的inode,继而指向两块不同的数据块。但是A的数据块中存放的只是B的路径名(可以根据这个找到B的目录项)。
A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
软链接 创建命令语法 : ln -s 源文件 软链接文件
ln -s oldboyfile oldboyfile_hard_link
软链接小结:
1.软链接类似于WINDOW的快捷方式。linux 中的软链接时特殊的文件,文件类型是l
2.软链接类似一个文件文件,里面存放的是源文件的路径,指向源文件实体。
3.删除源文件,软连接文件依然存在,但是无法访问指向的源文件路径内容了。
4.失效的时候一般是白字红底闪烁提示。
5.执行命令 ln -s 源文件 软链接文件,即可创建软连接文件。
6.软连接和源文件是不同类型的文件,也是不同的文件,inode号也是不同的。
7.软链接文件rm 命令删除。
8.目录的软连接可以ln -s
区别:
使用限制上:
硬链接:
a.不能对目录创建硬链接,原因有几种,最重要的是:文件系统不能存在链接环(目录创建时的".."除外,这个系统可以识别出来),
存在环的后果会导致例如文件遍历等操作的混乱(du,pwd等命令的运作原理就是基于文件硬链接,顺便一提,ls -l结果的第二列也是文件的硬链接数,即inode节点的链接数)
b:不能对不同的文件系统创建硬链接,即两个文件名要在相同的文件系统
c:不能对不存在的文件创建硬链接,由原理即可知原因。
软链接:
a.可以对目录创建软链接,遍历操作会忽略目录的软链接。
b:可以跨文件系统
16. find : 按照文件属性去查找
1).文件名:
find 查找的目录 -name '*.log' ## -name 根据文件名查找(精确查找)
find 查找的目录 -iname ## -name 根据文件名查找,但是不区分大小写
2).文件大小:
find 查找的目录 -size +10M ##查找大于10M的文件
find 查找的目录 -size 1000c ##查找等于1000C的文件
3).文件的类型:
find . -type f/d/
4).文件的时间:
find . -type f -mtime +7 -exec rm -f {} \; ##-mtime 时间 +7 ##7天之前 -7 最近7天
find . -type f -mtime +7 | xargs ls -l ##同样效果
5).文件权限
find /opt -perm 777 ##查找/opt目录下 权限为 777的文件
6).指定时间内修改的文件
find . -atime -2 ##查找两天内受到访问的文件
find /date/ -mtime -5 ##查找修改时间在5天内的文件
7).文件属主
find . -user was ##查找用户属was的文件
find . -nouser ##查找没有对应任何用户的文件
8).反向查找
find . -type d ##查找文件类型为目录的
find . ! type d ##查找文件类型不为目录的
9).用户组
find . -group was ##查找用户组为was的文件
find . -nogroup ##查找没有对应任何用户组的文件
扩展知识:将找到的文件移动到指定位置的几种方法:!!!!!!!!!
方法1:
[root@mylinux home]# find . -name '*.txt' | xargs -i mv {} Dir2 <==xargs的-i参数使得{}可替代find找到的内容
方法2:
[root@mylinux home]# find . -name '*.txt' | xargs mv -t Dir2/ <==mv -t可以颠倒源文件和目录
方法3:
[root@mylinux home]# mv `find . -name '*.txt'` Dir2/ <==使用``优先执行命令
扩展知识: find 一般结合和exec和xagrs来使用
两者的区别:
-exec
该参数是逐个将查找到的结果文件传递给后面的参数执行,如果文件比较多则执行的效率比较低;
文件名中有空格等特殊字符也照常处理 ※※※
-xargs
该命令是将查找到的结果一次性传递给后面的命令来执行,命令的执行效率高,可以使用-n 参数控制一次传递文件的个数
特殊的文件名需要处理(find . -name "*edu*" -print0 | xargs -0 ls -lh)
17. xargs:将标准输入转换成命令行
常用选项说明:
-n 指定每行的最大参数值n,可以将标准输入的文件划分为多行
-d 自定义分隔符
-i 使得{}可替代find找到的内容
-p 提示用户确认是否执行后米的命令
-0 用null代替空格作为分割符,配合find命令的 -print0 选项的输出使用
范例:
[root@mylinux Dir2]# cat a.txt
a b c d f g s d f h d
[root@mylinux Dir2]# xargs < a.txt
a b c d f g s d f h d
[root@mylinux Dir2]# xargs -n 3 < a.txt
a b c
d f g
s d f
h d
18. rename: 重命名文件 ※※※
范例:批量更改文件名称
[root@mylinux Dir2]# ls -al
total 8
drwxr-xr-x 2 root root 4096 Mar 8 16:58 .
drwxr-xr-x. 4 root root 4096 Mar 8 16:30 ..
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_1_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_2_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_3_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_4_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_5_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_6_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_7_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_8_finished.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_9_finished.jpg
[root@mylinux Dir2]# rename "_finished" "" * <==将所有的_finished替换为空 ※※※
[root@mylinux Dir2]# ls -al
total 8
drwxr-xr-x 2 root root 4096 Mar 8 16:58 .
drwxr-xr-x. 4 root root 4096 Mar 8 16:30 ..
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_1.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_2.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_3.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_4.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_5.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_6.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_7.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_8.jpg
-rw-r--r-- 1 root root 0 Mar 8 16:57 stu_102999_9.jpg
19. basename 显示文件名或目录名 ※※※
范例:
[root@mylinux dir1]# basename /date/dir1/file1.txt
file1.txt
[root@mylinux dir1]# basename /date/dir1/file1.txt .txt
file1
20. dirname 显示文件或目录名称 ※※※
范例:
[root@mylinux dir1]# dirname /date/dir1/file1.txt <==只显示文件所在的路径
/date/dir1
21. file 显示文件的类型
范例:
[root@mylinux date]# file dir1/
dir1/: directory
22. md5sum 计算和校验文件的MD5值
常用选项说明:
-c 从指定文件中获取MD5校验值,并进行校验 ※※※
--status 校验文件使用的参数,不输出任何信息,可以通过命令的返回值来判断
范例:
[root@mylinux Dir2]# md5sum oldboy.txt <==得到文件的MD5值
c188b0ec73677745f5c78bf5b2fb96d3 oldboy.txt <==第一部分:文件的md5值,第二部分,文件的名称
[root@mylinux Dir2]# md5sum oldboy.txt >md5.log <==先生成校验文件
[root@mylinux Dir2]# md5sum -c md5.log <== -c 校验MD5值
oldboy.txt: OK
[root@mylinux Dir2]# md5sum --status -c md5.log <==不输出任何信息,可以通过命令的返回值来判断
[root@mylinux Dir2]# echo $?
0
23. du 计算文件或目录的容量
常用选项说明:
-h 人性化显示容量信息
-s 仅显示总容量
范例:
[user@mylinux STATUS]$ du -h *
196K a.txt
8.0K PX_Monitor
8.0K status.sh
44K SystemCatalog