Linux:目录与文件操作
1 查看文件权限与属性
1.1 查看文件属性
- 查看基本属性
ls -l fileName #列出文件的权限与基本属性
ll fileName #ls -l fileName的简写形式
ls -a fileName #列出包括隐藏文件的全部文件
ls -d fileName #仅列出目录本身
ls -h fileName #将容量以易读的方式列出(GB、MB等...)
ls -R fileName #连同子目录内容一并列出
ls -s fileName #以容量大小排序
ls -t fileName #以时间排序
| 权限 | 拥有者 | 节点数 | 所属组 | 文件大小 | 最后一次修改时间 | 文件名 |
|---|---|---|---|---|---|---|
| drw-r--r-- | root | 1 | root | 4089 | 7月 15 14:33 | local |
-
文件权限
-
将[d][rw-][r--][r--]这10个字符分为四组,分别是文件类型、拥有者权限、所属群权限、其他人权限。
- 第一个字符具体含义
- [d]目录。
- [-]普通文件,包含:一般文本文件(ASCII)、数据格式文件(特定格式的文本)、二进制文件(可执行文件)等
- [l]为链接文件,类使用Windows上的快捷方式。
- [b]块设备文件,如硬盘、软盘等存储设备。
- [c]字符设备文件,如鼠标键盘等之类的串行端口。
- [s]套接字,数据接收文件。
- [p]管道(FIFO,first-in-first-out),用于解决多程序访问同一个文件的文件。
- 其他字符三个一组,均为rwx组合(详见权限含义)
- 第一个字符具体含义
-
节点数:表示有多少文件名链接到此结点。
-
拥有者:此文件拥有者的账号。
-
所属组:文件所归属的群组。
-
文件大小:文件容量大小单位为Bytes。
-
最后一次修改时间(默认输出,文件还有其他的时间属性如下)
- mtime(modification):最后一次修改时间
- ctime(status time):最后一次修改权限与属性的时间
- atime(access time):最后一次读取文件内容的时间
ls -l --time=mtime #默认列出的是mtime,可以通过这条命令更改列出的是哪一种时间
- 文件名
- 查看基本属性
lsattr -a fileName #将隐藏文件秀出来
lsattr -d fileName #列出目录本身属性
lsattr -R fileName #连同子目录的数据一并列出
file fileName #查看文件的基本类型,(二进制还是ASCII,还是...)
1.2 文件基本权限含义
- 对文件(记录数据)
- r(read):读取文件的实际内容。
- w(write):编辑、新增或修改文件的内容。
- x(execute):具有被系统执行的权限。
- 对目录(记录文件名列表)
- r(read contents in directory):可查询该目录下的文件数据。
- w(modify content of directory):更改目录结构(新建、删除、重命名、移动文件)。
- x(access directory):可以把当前目录当成工作目录
1.3 文件特殊权限含义
-
SUID(Set user ID):只能针对可执行程序,可以让普通用户短暂拥有root权限。
graph LR 普通用户 --执行--> passwd命令:具有SUID权限 --短暂获得root权限--> 更改/etc/shadow文件 -
SGID(Set group ID):在具有SGID目录下创建的文件夹,用户组归属该目录。
graph LR
普通用户 --> 没有SGID权限的目录A --新建文件b.txt--> b.txt用户组为普通用户
普通用户 --> 具有SGID权限的目录C --新建文件d.txt--> 目录C和d.txt所属用户组相同
-
SBIT(sticky Bit):只能针对目录。对于下图的情况B虽然有该目录的w权限,但是无法删除或操作其他用户的文件,只能删除或操作自己创建的文件。
graph LR 用户A -.创建.-> a.txt subgraph B用户对该目录有w权限 E2([目录具有SBIT权限]) 目录A --> a.txt 目录A --> b.txt end 用户B -.无法删除.-> a.txt 用户B -.创建.-> b.txt
1.4 修改文件属性
- 修改拥有者与所属组
chgrp group fileName #改变所属组:chgrp [用户组] |文件名|
chown own:group fileName #改变拥有者:chown [拥有者]:[用户组] |文件名|
- 基本9大权限修改
#r=4,w=2,x=1,设置权限可以把需要的权限分数相加,例:755为-rwxr-xr-x
chmod 755 fileName #改变文件权限,chmod [权限] 文件名, 权限r=4,w=2,x=1
#ugoa分别代表:user、group、other、all
#+-=分别代表:加入、减去、设置
#rwx分别代表相应的权限
chmod u=rwx,go=rx fileName #改变文件权限,chmod |ugoa| +-= |rwx| |文件名|
- 文件特殊权限修改
chmod 6755 fileName #新加入到第一项为特殊权限,权限4=SUID,2=SGID,1=SBIT
#输出:-rwsr-sr-s
#chmod 6744 fileName
#输出:-rwsr-Sr-S,大写代表没有x权限,有问题!!要注意,特殊权限必须要有基本的x权限的支持
- 修改文件时间属性
#touch [-参数] fileName
touch -m fileName #修改mtime(modification):最后一次修改时间
touch -c fileName #修改ctime(status time):最后一次修改权限与属性的时间
touch -a fileName #修改atime(access time):最后一次读取文件内容的时间
touch -a -t [YYMMDDhhmm] fileName #指定日期和时间
touch -a -d "4 days ago" fileName #指定日期
touch fileName #创建一个文件夹
- 设置文件隐藏属性
#chattr [+-=] [参数] fileName
#+-=分别代表:加入、减去、设置
chattr +A fileName #设置这个属性,你虽然访问fileName,但是atime不会改变
chattr +a fileName #此文件只能增加数据,而不能删除和修改数据,且只有root能设置
chattr +c fileName #存储时:会自动压缩后存储,读取时:会自动解压后读取
chattr +i fileName #让文件不能被删除、改名、设置连接、写入或添加数据
chattr +s fileName #文件被删除,完全删除
chattr +u fileName #文件被删除,有可能恢复,与s命令正好相反
chattr +d fileName #当dump程序执行时,不会被dump备份
- 创建文件夹默认权限
umask #查看创建文件夹默认删除的权限,一般除了拥有者其他删除了w权限
umask 0022 #设置创建文件夹默认删除的权限
1.5 文件限制
- 系统文件默认采样Ext2/Ext3文件系统。文件名最大为255个字符,包含目录的文件名最大为16*255个字符。
- 尽量避免 * ?<> ; & ! [] | \ ' " () {} . +-等特殊字符
- /etc/shadow是一个账号管理文件,记录了系统所有账号的数据。
2 文件基本操作
- 工作目录
# . 代表当前目录
# .. 代表上层目录
# - 代表前一个工作目录(你从哪里切过来的)
# ~ 代表“当前用户身份”主目录
# ~user 代表用户“user”的主目录
cd /director #切换工作目录(Change Directory)
pwd -p #显示当前工作目录(Print Working Directory)
basename /filePath/fileName.txt #取出目录的文件名,fileName.txt
dirname /filePath/fileName.txt #取出目录的目录,/filePath/
- 新建目录
mkdir fileName #新建一个文件夹
mkdir -m 777 fileName #创建目录并配置权限
mkdir -p fileName/fileName #可以一次创建多层目录
- 删除文件或目录
rmdir fileName #删除一个空目录
rmdir fileName/fileName #删除一个多层空目录
rm fileName #删除一个文件或目录
rm -f fileName #强制删除一个文件或目录
rm -r fileName #递归删除包括子目录下的全部文件
- 移动和重命名文件和目录
mv fileName1 /fileName2 /path #把fileName1、/fileName2...移到目录/path下
mv fileName1 fileName2 #把fileName1重命名为fileName2
mv -f fileName1 fileName2 #强制重命名
mv -u fileName1 fileName2 #fileName1比fileName2新才会更新
- 复制文件和目录
cp fileName1 /fileName2 /path #把fileName1、/fileName2...复制到目录/path下
cp -a fileName /path/fileName #相当于-pdr
cp -p fileName /path/fileName #连同文件的属性一并复制
cp -d fileName /path/fileName #若源文件为连接文件的属性,则复制连接文件的属性,而非文件本身
cp -r fileName /path/fileName #递归复制包括子目录下的全部文件
cp -i fileName /path/fileName #若文件已经存在,会先询问
cp -f fileName /path/fileName #强制把fileName1复制到/path
cp -s fileName fileName_link #创建文件快捷方式
cp -u fileName1 fileName2 #fileName1比fileName2新才会更新
cp -l fileName fileName_hlink #进行硬连接连接文件的创建
- 文件的搜索
#数据库里查询
whereis -b fileName #找出二进制文件fileName
whereis -m fileName #只找说明文件manual路径下的文件
whereis -s fileName #只找source源文件
whereis -u fileName #查找不在上述三个选项当中的其他特殊文件
#在数据库/var/lib/mlocate中查文件
#这个数据库的配置文件是/etc/updatedb.conf,一般数据库一天一更新
locate -i keyword #忽略大小写差异
locate -r re_keyword #可接正则表达式
updatedb #依据配置文件更新数据库
gantt
title find时间线,今天是1月12日
dateFormat YYYY-MM-DD
+4: 2021-01-01, 5d
4 : 2021-01-06,1d
-4: 2021-01-07, 5d
#指定时间的话如上图所属,+-分别代表多少天之前和多少天之后的时间
find /path -mtime +4 #找出/path目录下,最后一次修改时间,大于4以前的文件
find /path -ctime -4 #找出/path目录下,最后一次修改权限与属性的时间,最近4天以内的
find /path -atime 4 #找出/path目录下,最后一次读取文件内容的时间,第4-5天的
find /path -uid id #找出/path目录下,用户ID为id人的文件
find /path -gid id #找出/path目录下,用户组ID为id组的文件
find /path -user name #找出/path目录下,用户名为name的文件
find /path -group name #找出/path目录下,用户组为name的文件
find /path -nouser #找文件不存在/etc/passwd人的文件
find /path -nogroup #找文件所有组不存在/etc/group组的文件
find /path -name fileName #在/path目录下找出名为fileName的文件
find /path -name '*keyword*' #在/path目录下找出包含keyword关键字的文件
find /path -size [+-]SIZE #在/path目录下找+大于、-小于SIZE大小的文件,c byte、k bytes,例:-size +50k
find /path -type TYPE #在/path目录下找类型为一般文件(f)设备文件(b,c)目录(d)链接(l)socket(s)fifo(p)的文件
find /path -perm 7000 #列出在/path目录下权限为7000的文件
find /path -perm -7000 #列出在/path目录下,每一项包含权限为7000的文件
find /path -perm +7000 #列出在/path目录下,包含权限为7000任一的文件
find /path -perm +7000 -exec ls -l {} \; #查找并输出
- 文件内容阅览
cat -A a.txt #相当于-vET
cat -v a.txt #列出一些看不见的特殊字符
cat -E a.txt #将结尾的段字符显示出来
cat -T a.txt #将[Tab]以^T显示出来
cat -n a.txt #列出行号
cat -b a.txt #列出行号,但不包括空格
tac -[...] a.txt #和cat用法一样,只不过反过来了
more a.txt #显示文件
# [space] :向下翻一页
# Enter :向下滚动一行
# /string :向下查询“string”字符串
# :f :立刻显示文件名和目前显示的行数
# q :立刻退出离开
# b或[ctrl]-b :往回翻页
less a.txt #显示文件
# [space] :向下翻一页
# PageDown :向下翻一页
# PageUp :向上翻一页
# /string :向下查询“string”字符串
# ?string :向上查询“string”字符串
# n :重复前一个查询
# N :反向重复前一个查询
# q :立刻退出离开
head -n 100 a.txt #取出前100行
tail -n 100 a.txt #取出后100行
tail -n +100 a.txt #取出100行之后的数据

浙公网安备 33010602011771号