【linux】学习笔记Chap_25_关于File那些事儿
touch命令
功能
- 创建文件,touch将创建一个普通空文件,并不会进入编辑模式
vim /vi
也可以创建文件,或者用>
将结果写入文件,若文件本身不存在,系统将创建。
- 大部分时间不需要用touch创建文件,部分情况下用touch可以方便快速创建文件
语法
- touch 【-acm】 【-t time】 file file2 file3…
touch 将修改文件的访问时间(access time) 和 修改时间(modification)
如果想将许多文件修改成同一时间,touch * (将文件的访问时间统一)
选项
- -t 设定时间,时间格式是[[YY]YY]MMDDhhmm[.ss]
年份可以半省略 21/2021 或全省略
- -a 只修改访问时间
1 | touch -ac -t 202107301330 file |
- -c (no create )不创建文件,touch 将只修改文件的时间,如果某个文件不存在也不会创建
文件命名规则
- 最长255个字节
- 文件名中除了null(空)和/(slash)的其它字符,因为/代表路径切换
- 不要乱起名
- 程序不用要test,因为系统内置一个test命令,用来比较文件类型和值
特殊符号的文件名
对于包含特殊符号的文件名,不能用一般方式引用他们,像一个文件info;date
用命令ls -l info;date
就会出错
要用引号:ls -l 'info;date'
或者用\
:ls -l info\date
用法安全的字符a-zA-Z0-9._- (dot、underscore、hyphen)
cp命令
功能:
- 复制文件/文件夹
复制单个文件
语法:
cp -ip file1 file2
#file1是已经存在文件 file2是目的地文件
如果file2不存在,cp将创建;如果存在将先将内容清除,再替换内容
所以,同目录下不能出现两个同名文件,不能有以下命令
1 | cp file1 file1 |
选项:
- -i (interactive) 因为cp容易清除目的文件的内容,所以-i用来询问是否覆盖目的文件
1 | cp: overwrite extra(yes/no)? 回复y会替换,其它内容则不替换 |
复制多个文件
语法:
cp data1 data2 data3 backups
将data1 data2 data3三个文件复制到backups 这个目录中(backups只能是目录,不能是文件,目录可以不存在)
1 | 或者 cp data[123] backups (使用正则) |
复制目录
语法:
cp -r [-ip] directory1 dire2
# -r必须要添加
选项:
-r
(recursive) 将整个目录子树全部复制!!!包含子目录和文件
命令:
- 将directory下全部目录(只有目录)拷贝
1 | cp directory/* backups 正则表达 |
mv命令
功能
- 移动一个或多个文件到已经存在的目录中
语法
- mv -if file[123] directory #最后一个参数只能为目标目录,默认将前面参数当作源文件(或目录)
选项
-i
interactive 和cp的-i类似,如果目的目录中已经包含要移动的文件,询问是否覆盖-f
force 强制移动不询问
重命名文件或目录
语法
mv -if oldname newname
rm命令
功能
- 删除文件或目录
语法
rm [-rfi] name
特性
- 删除后不可恢复,危险语句
rm -rf /
删库跑路专用
选项
-r
recursive 递归,删除目录使用-i
interactive 询问-f
force 不询问强执行,而且权限大于-i
文件权限
- 权限分三种:读、写、执行
- 对于不同文件权限,出于安全考虑一定要设置好!如:shell脚本可读、可执行。文档文件可读可写。
文件
读:文件是可读的
写:修改文件
执行:shell脚本或其它程序
目录
读:查看内容
写:复制|删除|移动|目录内创建新文件
执行:可遍历文件
目录一般为可读、可执行
但,若先在目录内创建一个文件,再退出修改目录权限为不可写,经过测试发现,仍然可以删除目录内文件,并仍然可以在目录内创建文件???
设置userid
每个用户对系统来说,只能用userid辨识。而为了保证不同用户在同一个文件系统不混乱,为了方便同一个unix上不同用户和小组文件管理,开发者发明了 拥有者、所在组、其它人 三个身份概念
- 创建新文件时的userid是文件拥有者,而拥有者是唯一的可以改变文件权限的userid
(除了root外) root有最高权限,一切秘密无法对root隐藏
- 文件权限将分为 拥有者、所在组、其它人
当root创建用户时,可以指定用户所在组, groupid保存在/etc/group中
- 命令
id
可以查看当前用户id和groupid
1 | id |
- 命令
group
可以查看用户组名字
1 | group |
用户可以同时归属多个不同小组,拥有不同组权限
1 | 补充 ls |
r = read 权限 w = wirte x = execute - = 无权限
File Modes
用数字代替用文本的rwx表示
4 = r =read 读权限 2 = w =write 写 1 = e =execute执行 0 = no
这些数字可以直接相加,得出总权限
rwx = 4+2+1 =7 r-x = 4+1 =5 没有写权限 r-- = 4 只有读权限
755 表示拥有者有全部权限,所属组和其它人可读可执行 777 所有人有所有权限
chmod命令—修改权限
功能:
- 可以修改文件权限但只能用mode表示
语法
- chmod mode file (上面的file mode 755)
1 | chmod 755 file1 file2 |
umask命令—修改创建文件默认权限
默认下,创建新文件时的(file mode)权限为
666 一般文件 777 可执行文件 777 目录
可能通过umask
可调整初始文件权限
语法
- umask [mode] 这里的mode和file mode是相反的
1 | umask 022 相当于rwx = 755 不给owner高限制,而所属组其它人不能写 |
shred命令
为保证效率,删除某一文件一般只需删除其在文件系统中的对应项,实际的文件内容则仍完好无损,这一特性也多为常见的数据恢复软件所利用以恢复文件。
针对这些特点,shred以用能最大程度破坏原始数据的模式多次覆写文件的方式来达到安全删除的目的
语法
- shred -fvuz file
功能
- 多次重写已经存在的文件,致使从系统中恢复的数据也会变星面目全非
特性
- 即使原文件只有5KB(分配8KB,两个块) shred后会将8KB全部覆盖乱写
选项
- -v verbose
- -z 最后一次重写,将全部内容替换成0
- -f force 强制执行
- -u 最后重写完成自动删除文件
1 | shred -vzu test.txt #安全删除 |
Link命令—链接
Unix创建文件时,系统将做几件事
1、在存储设置分配一片空间
2、创建一个index node的结构 保存文件信息,普通用户不用了解这个,文件系统会自动处理
3、同时自动创建一个用户给的name作为默认的第一个link (硬链接)
使用stat
命令 可以查看文件的I-node(index node)
1 | stat Chap_25_work.txt |
容量、分配给文件的块、文件类型
文件实际存在的设备、i-number(源文件的唯一标识)、其它文件链接到此的数量(Links)
权限、拥有者、所属组
上次修改时间
上次访问时间
上次inode修改时间
I-number
每个文件都有唯一Index number (i-number) 方便文件系统查找和记录
虽然目录下面包含许多文件,但实际上,目录只包含文件的名字和i-number
所以,这些目录实际上占很小容量
使用ls -i
可以查看i-number
1 | ls -i Chap_25.... |
结果和stat 查询的i-number一样
Links硬链接
特点:
- 占内存空间
Unix允许多个链接到同一个文件(stat file 可以查看links),即,一个文件可以有多个名字
上面说到,文件被创建时,系统将产生独一个i-number
如果创建文件name1时,链接到已经存在的一个文件Myfile的i-number
那name1将是Myfile的一个别名,两个名字指向同一个i-number
ln命令
语法
- ln file newname # file是已经存在的普通文件 newname是个链接文件
将多个链接放到目录中
- ln file1 file2… directory file[123]是已经存在的文件,directory 是想要放在的目录
和cp关系
cp到一个已经存在文件,将目标文件内容清除,再次原文件内容复制到目标文件
如不存在,将创建一个新文件(有自己的i-node) 再将原文件内容复制
源文件和目标文件是不同的i-number
与mv
将原文件改名,或移动位置,应该只修改了存放位置,不改变i-number
与rm
如果删除一个link ,系统将link从目录中删除并断开与i-number的连接
如果某个文件只剩一个link,删除link后会把文件也删除
目前大部分文件只有一个link,所以在rm file时会表现像删除了原文件
如
现在创建一个spacewar 文件,创建一个lthero链接到spaceware的i-number
查询 stat spacewar
其中links为2 # links显示链接到源文件(有i-number直接文件)的链接数目
查询 stat lthero
其中的links也为2
说明 spacewar和lthero都只是个links(都是傀儡罢了)
现在即使删除spacewar ,其i-number的原文件仍然存在(因为lthero保持与它连接)。
直到lthero也被rm了,文件才真正删除!
Symbolic links软链接—不占内容空间
上面说的link有两个缺点
- 不能对目录创建link
- 不能在不同文件系统(不能跨分区)创建链接
为了改进上述缺点,使用Symbolic link 或Symlink
使用ln -s
选项
Symlink不会包含源文件的i-number ,而是**文件的路径pathname,**就像win的快捷方式
语法:
- ln -s 源目录或文件 目标目录或文件
举例
- 查看默认的sh命令,其容量只占4B,足够存放一个路径
1 | ls -l /bin/sh |
- 再看bash文件占用很大,才是真正的硬链接位置
1 | ls -l /bin/bash |
如果删除了原文件,symbolic link不会被删除,但路径也会失效
默认下将Link以硬链接为代表,记得stat和ls -l会显示硬链接数量,显示软链接无意义
Symbolic link与目录
- ln -s /home/lthero /home/backup
给lthero目录创建一个备份软链接 backup
查看backup属性
1 | ll backup |
如果
cd backup
会发生什么可以进入backup这个伪目录,但其内容和lthero一样
- 用cd -P 可以进入链接到的真实路径,进入了lthero目录
- cd -L 和默认的一样,进入backup伪目录
whereis locate find
whereis命令
功能:
- 在目录中查找与Unix命令相联系的文件
语法:
- whereis -bms command 命令就是unix中命令
1 | whereis ls |
locate命令
locate方便使用但功能相对find少
语法:
- loacte [-bcirS] pattern #pattern是要查询的路径名
如
1 | loacte dict |grep words |
会在整个根目录下查找包含’dict’的文件,并返回其路径
1 | /usr/share/help-langpack/en_GB/gnome-dictionary/similar-words.page |
选项
- -r 使用正则表达式
locate -r ‘.jpg$’ 查找全部jpg图片 locate ‘*.jpg’ 也可生效 locate -r ‘^temp&’ 查找名字为temp的文件
- -c Count 将记录所有文件路径数 常用
- -i 忽略大小写
由于找文件后面(basename)基础名字很方便,便有了
- -b 仅匹配路径名的基本名称
- -S 显示当前系统的数据库
1 | Database /var/lib/mlocate/mlocate.db: |
find命令—非常好用
由于whereis 只能查询与系统相关的命令文件
locate搜索也不完美。它只能在数据库中包含的路径查找指定pattern
- find又是最古老最复杂的,可能也是最好用的
1、 可以查找任何地方的任何文件
2、可以将结果以不同方式呈现
3、可以在除了unix linux其它平台使用
find 的通用语法
- find path… test… acton…
paths : find 将检查整个目录树,包括子树
tests : 对find查到的每个文件,将逐一检查是否符合要求
actions 对完成的结果进行近一步操作
1 | find /home -name Chap -print |
path : /home 查找此目录及其子目录
test : -name Chap 对每个文件按名字检测是否精准为 Chap
action -print 输出结果
paths详解
- find 可以同时查找多个目录 find /bin /sbin /usr/bin
test详解
这里才是find复杂的地方
选项
-type
- -type 查找文件的类型 后面接一个字符
find /etc -type f (file 一般文件)
find /etc -type d (directory 一般目录)
find /etc -type l (symbolic link软链接)
find /etc -print 则查找全部类型
-name
- -name 查找文件名字
可接正则 但用引号,否则会报错
find /etc -name '*.txt'
-print 按全部的**.txt格式**
find /etc -name Chap_25.txt -print 查指定的文件名
find /etc -name 'data[123]'
-print 正则表达查 data1 data2 data3
- -iname 忽略大小写查找名字
bin 和 Bin都会被查找
- -empty size=0 容量为0的
-perm 指定权限
1 | find / -type f -perm 755 -print |
- -size 指定大小 c指1B b指512B k指1KB M指1MB G 1GB
find / -size 1k -print 恰好1KB
find / -size -1k -print 小于1kB
find / -size +1k -print 大于1KB
- -mmin 查看最近num时间(单位分钟)内被修改的文件
find / -mmin -30 -print
- -atime 查看num 时间(单位:天)内没用过的文件
find / -atime +180 -print
**#**删除180天没用过的备份
find / -name ‘*.backup’ -atime +180 -delete (action是删除)
#可以多个test一起用
find -type f -name ‘*.txt’ -print
反选
- 用叹号\! 表示除了后面这个选项
find / \! type -f \! -name '*.jpg' -print
报错了怎么办?
- 对于某些目录或文件,用户无权利查看或遍历
find此时后报错,将报错信息丢弃
1 | find / -type d -name bin -print 2>/dev/null |
Actions
功能:
- actions 将指挥find查找文件后做什么
最常用的就是-print
输出 大部分版本下,-print是默认的action
选项
- -print 输出路径
- -fprint [file] 将结果写入文件中
1 | #打印全部视频信息到文件列表中 |
- -ls 展示长信息,同ls
- -fls [file] 同-ls 结果写入文件
-delete 删除结果的文件
-exec选项
- -exec command {} \; 执行 command命令,{}表示符合的文件名
- -exec 可以使用任何程序
列表全部结果的详细信息
1 | find -name '*.mp3' -exec ls {} \; |
将查找的全部.mp3全部删除
1 | find ./ -type f -name '*.mp3' -exec rm {} \; |
- -ok command {} \; 同exec 但运行前将询问
xargs命令
功能:
- 处理已经发现的文件,将输出作为另一个命令的参数输入,配合
find
使用,可以在诸多目录中,查找包含某些内容的文件
语法
- -prt -i string 命令 [参数]
如上次想将网页的 please input something 替换,但不知道在哪个文件中,就可以用
1 | find -type f -name '*.php' | xargs grep 'please input somethign' |
而且不用担心find返回结果过多,使给grep的参数过多。因为xargs可以分步将输入传递给grep,有点像遍历
- find 找到一个结果就把结果传给grep
选项
- -i 替换结果
1 | find ~ -type f -name '*.txt' | xargs -i mv {} ~/backup/ |
{} 里面是每次输出的结果—每个文件的路径,可以通过cut或awk获得文件名字