文件管理


目录:

文件管理

文件类型分为7种

"-"或者"f"代表普通文件
"d"代表目录
"b"块设备文件(硬盘等随机访问文件)
"l"软连接(快捷方式)
"c"字符设备文件(字符文件//例如,鼠标,键盘)
"s"套接字文件
"p"命名管道文件

image-20220616104042368

用颜色来区分Linux的文件

  • 蓝色->目录

  • 白色->文件

  • 浅蓝色->链接

  • 红色->压缩包

  • 绿色->可执行文件

  • 黑底黄字->设备文件

cd 切换工作目录至dirname

cd命令用来切换工作目录至dirname。其中dirName表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录)。另外,~也表示为home directory的意思,.则是表示目前所在的目录,..则表示目前目录位置的上一层目录。

Grammar

cd (选项) (参数)

选项

  • -p 如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录
  • -L 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录。
  • - 当仅实用-一个选项时,当前工作目录将被切换到环境变量"OLDPWD"所表示的目录。

Living Example

cd    进入用户主目录;
cd ~  进入用户主目录;
cd -  返回进入此目录之前所在的目录;
cd ..  返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思);
cd ../..  返回上两级目录;
cd !$  把上个命令的参数作为cd参数使用。
cd 加目录路径 (表示到那个目录里面去)

ls 用来显示目标列表(可以接通配符)(ll等于ls -l)

ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。

Grammar

ls(选项)(参数)

选项

  • -a 表示所有文件(包括隐藏文件)

  • -h 表示以人类可读懂的形式显示(就是显示文件大小的时候有单位显示)

  • -l 表示以长格式显示

  • -1 表示一个文件或目录一行一个的显示

  • -F 使用这个参数表示在文件的后面多添加表示文件类型的符号,例如*表示可执行,/表示目录,@表示连结文件,这都是因为使用了-F这个参数。但是现在基本上所有的Linux发行版本的ls都已经内建了-F参数,也就是说,不用输入这个参数,我们也能看到各种分辨符号。

  • -d 仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;

  • -i 显示文件索引[节点号]{.underline}(inode)。一个索引节点代表一个文件

  • -S 表示以文件大小排序(降序)

  • -t 用文件和目录的更改时间排序;

  • -n 以用户识别码和群组识别码替代其名称

  • --color[=WHEN]:使用不同的颜色高亮显示不同类型的。

  • -s, --size # 在每个文件名左侧输出该文件的大小,以 1024字节的块为单位。如果设置了 POSIXLY_CORRECT的环境变量,除非用" -k"选项,块大小是 512 字节

  • -a:显示所有档案及目录(ls内定将档案名或目录名称为"."的视为影藏,不会列出);

  • -A:显示除影藏文件"."和".."以外的所有文件列表;

  • -1:与"-C"选项功能相反,所有输出信息用单列格式输出,不输出为多列;(数字1)

  • -k:以KB(千字节)为单位显示文件大小;

  • -l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;

  • -R:递归处理,将指定目录下的所有文件及子目录一并处理;

  • -C:多列显示输出结果。这是默认选项;

  • --full-time:列出完整的日期与时间;

  • -L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;

  • -r:以文件名反序排列并输出目录内容列表;

  • -m:用","号区隔每个文件和目录的名称;

  • -f:此参数的效果和同时指定"aU"参数相同,并关闭"lst"参数的效果;

  • --file-type:与"-F"选项的功能相同,但是不显示"*";

  • -b:将文件中的不可输出的字符以反斜线""加字符编码的方式输出;

  • -c:与"-lt"选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与"-l"选项连用时,则排序的一句是文件的状态改变时间;

参数

目录:指定要显示列表的目录,也可以是具体的文件。

# Living Example 1:

[root@test-6 ~]# ls /etc/sysconfig/ -d (查看目录)

/etc/sysconfig/

# Living Example 2:
[root@test-6 ~]# ls 1 (数字1)

显示包含数字的文件名和目录名

ls *[0-9]* 

stat fileName 用于显示文件的状态信息

stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。

Grammar

stat [选项]... FILE...
stat(选项)(参数)

选项

  • -L:只显示链接文件;

  • -f:仅仅显示文件系统状态而非文件状态;

  • -c:指定文件信息显示的格式标准

  • -t:以简洁方式输出信息;

  • -%A Access rights in human readable form

  • -help:显示指令的帮助信息;
  • --version:显示指令的版本信息。

参数

文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。

Living Example

[root@test-6 ~]# stat 1111.txt 
  File: "1111.txt"
  Size: 44          Blocks: 8          IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 19984       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-24 20:02:05.671293985 +0800    最近一次的访问时间
Modify: 2018-12-24 20:02:05.671293985 +0800    最近一次修改文件内容的时间
Change: 2018-12-24 20:02:05.673294092 +0800    最近一次修改权限的时间

image-20220616104953479

[root@test-6 ~]# stat -c %A /etc/hosts
-rw-r--r—

image-20220616105017997

file 用来确定给定文件的类型

file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。

Grammar

file FileName
file [-bchikLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname]
          [-F separator] [-f namefile] [-m magicfiles] file ...
     file -C [-m magicfiles]
     file [--help]
file (选项) (参数)

选项

  • -b:列出辨识结果时,不显示文件名称;
  • -f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;

  • -c:详细显示指令执行过程,便于排错或分析程序执行的情形;

  • -L:直接显示符号连接所指向的文件类别;

  • -m<魔法数字文件>:指定魔法数字文件;

  • -v:显示版本信息;

  • -z:尝试去解读压缩文件的内容。

参数

文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

Living Example

[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text

[root@localhost ~]# file -b install.log      <== 不显示文件名称
UTF-8 Unicode text

[root@localhost ~]# file -i install.log      <== 显示MIME类别。
install.log: text/plain; charset=utf-8

[root@localhost ~]# file -b -i install.log
text/plain; charset=utf-8

显示多个文件类型
[root@CentOS6 ~]# file install.log install.log.syslog  anaconda-ks.cfg 
install.log:        UTF-8 Unicode text
install.log.syslog: ASCII text
anaconda-ks.cfg:    ASCII English text

显示符号链接的文件类型
[root@localhost ~]# ls -l /var/mail
lrwxrwxrwx 1 root root 10 08-13 00:11 /var/mail -> spool/mail

[root@localhost ~]# file /var/mail
/var/mail: symbolic link to `spool/mail'

[root@localhost ~]# file -L /var/mail
/var/mail: directory

[root@localhost ~]# file /var/spool/mail
/var/spool/mail: directory

[root@localhost ~]# file -L /var/spool/mail
/var/spool/mail: directory

[root@test-7 ~]# file test 
test: ASCII text

可执行的二进制文件
[root@test tmp]# file /bin/cat
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=797f79d6d2dc5a84cdc3c21df400f65569ce9a92, stripped

tree 以树状图列出目录的内容

tree命令以树状图列出目录的内容。

Grammar

tree  [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title] [-o filename]
       [--nolinks] [-P pattern] [-I pattern]  [--inodes]  [--device]  [--noreport]  [--dirsfirst]
       [--version] [--help] [--filelimit #] [--si] [--prune] [--du] [--timefmt format] [directory
       ...]
tree(选项)(参数)

选项

  • -C:在文件和目录清单加上色彩,便于区分各种类型;

  • -a:显示所有文件和目录

  • -L NUMBER:目录树下显示的最大深度

  • -d:显示目录名称而非内容

  • -h:显示目录和文件的大小

  • -s:列出文件和目录大小;

  • -t:用文件和目录的更改时间排序;

  • -D:列出文件或目录的更改时间;

  • -f:在每个文件或目录之前,显示完整的相对路径名称;

  • -n:不在文件和目录清单加上色彩;

  • -F:在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","@","|"号;

  • -A:使用ASNI绘图字符显示树状图而非以ASCII字符组合;

  • -g:列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码;

  • -i:不以阶梯状列出文件和目录名称;

  • -l:<范本样式> 不显示符号范本样式的文件或目录名称;

  • -l:如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录;

  • -N:直接列出文件和目录名称,包括控制字符;

  • -p:列出权限标示;

  • -P:<范本样式> 只显示符合范本样式的文件和目录名称;

  • -q:用"?"号取代控制字符,列出文件和目录名称;

  • -u:列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码;

  • -x:将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该目录予以排除在寻找范围外。

参数

目录:执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。

Living Example

查看根下的目录
[root@AAAA7 ~]# tree / -L 1     #(-L表示指定第几层,1表示第一次,也可以是2……)
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

19 directories, 0 files
[root@AAAA7 ~]#

# 查看根下的目录
[root@AAAA7 ~]# tree / -L 2     #(查看到第二层)

head、tail、cat、tac、less 、more、nl、hesdump、od 查看文件内容

cat(单纯的在屏幕上显示出来,-n表示带行号显示)
tac (表示内容反过来显示)
nl /etc/passwd(nl:带行显示)

怎样一页一页地查看一个大文件的内容呢?
[root@localhost ~]# cat file_name.txt | more

image-20220616105756922

image-20220616105812156

image-20220616105839058

image-20220616105844090

head命令用于显示文件的开头的内容。在默认情况下,head命令 默认显示文件的头10行内容。

Grammar

head (选项) (参数)

选项

  • -n<数字>:指定显示头部内容的行数;
  • -c<字符数>:指定显示头部内容的字符数;

  • -v:总是显示文件名的头信息;

  • -q:不显示文件名的头信息。

参数

文件列表:指定显示头部内容的文件列表。

Living Example:

[root@test6 ~ 03:23:50]# head -3 /etc/passwd   #(看前3行等于head -n 3 /etc/passwd)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

tail 输入文件中的尾部内容

tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为"-",则读取标准输入。

注意:如果表示字节或行数的N值之前有一个"+"号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。N值后面可以有后缀:b表示512,k表示1024,m表示1048576(1M)。

Grammar

tail (选项) (参数)

选项

  • -n或--line=:输出文件的尾部N(N位数字)行内容

  • -c或--bytes=:输出文件尾部的N(N为整数)个字节内容;

  • -f或;--follow:显示文件最新追加的内容。"name"表示以文件名的方式监视文件的变化。"-f"与"-fdescriptor"等效;

  • tail -f = tailf

  • -F:与选项"-follow=name"和"--retry"连用时功能相同;

image-20220616110027880

  • --retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项"--follow=name"连用;

  • --pid=<进程号>:与"-f"选项连用,当指定的进程号的进程终止后,自动退出tail命令;

  • -q或--quiet或--silent:当有多个文件参数时,不输出各个文件名;

  • -s<秒数>或--sleep-interal=<秒数>:与"-f"选项连用,指定监视文件变化时间隔的秒数;

  • -v或--verbose:当有多个文件参数时,总是输出各个文件名;

  • --help:显示指令的帮助信息;

  • --version:显示指令的版本信息。

参数

文件列表:指定要显示尾部内容的文件列表。

Living Example

tail file # (显示文件file的最后10行)
tail +20 file # (显示文件file的内容,从第20行至文件末尾)

[root@test-7 ~]# tail -n5 /etc/passwd       #(查看passwd最后5行)
tail -c 10 file # (显示文件file的最后10个字符)
[root@test-6 ~]# tail -f /var/log/secure        (查看登陆日志)

image-20220616110106123

image-20220616110122985

[root@test-6 ~]# tail -fn 5 /var/log/secure     #(实时监控登陆日志的最后5行)

cat 连接文件并打印到标准输出设备上和合并文件

cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令。

注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。

Grammar

cat (选项) (参数)

选项

  • -n或--number:由"1"开始对所有输出的行数编号;
  • -A:显示不可打印字符,行尾显示$
  • -b或--number-nonblank:和-n相似,只不过对于空白行不编号;

  • -s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行;

  • -e:等价于"-vE"选项;

  • -t:等价于"-vT"选项;

参数

文件列表:指定要连接的文件列表。

Living Example

设m1和m2是当前目录下的两个文件

cat m1 (在屏幕上显示文件ml的内容)
cat m1 m2 (同时显示文件ml和m2的内容)
cat m1 m2 > file (将文件ml和m2合并后放入文件file中)

image-20220616110253744

tac 将文件已行为单位的反序输出

tac命令用于将文件已行为单位的反序输出,即第一行最后显示,最后一行先显示。

Grammar

tac (选项) (参数)

选项

  • -a或--append:将内容追加到文件的末尾;
  • -i或--ignore-interrupts:忽略中断信号。

参数

文件列表:指定要保存内容的文件列表。

less 允许用户向前或向后浏览文件

less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。

Grammar

less (选项) (参数)

选项

  • -N:每一行行首显示行号;

  • -e:文件内容显示完毕后,自动退出;

  • -f:强制显示文件;

  • -g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;

  • -l:搜索时忽略大小写的差异;

  • -s:将连续多个空行压缩成一行显示;

  • -S:在单行显示较长的内容,而不换行显示;

  • -x<数字>:将TAB字符显示为指定个数的空格字符。

less的常用动作命令:

回车键 向下移动一行;
y 向上移动一行;
空格键 向下滚动一屏;
b 向上滚动一屏;
d 向下滚动半屏;
u 向上滚动半屏;
h less的帮助;
w 可以指定显示哪行开始显示,是从指定数字的下一行显示;比如指定的是6,那就从第7行显示;
g 跳到第一行;
G 跳到最后一行;
p n% 跳到n%,比如 10%,也就是说比整个文件内容的10%处开始显示;
/pattern 搜索pattern ,比如 /MAIL表示在文件中搜索MAIL单词;
v 调用vi编辑器;
q 退出less
!command 调用SHELL,可以运行命令;比如!ls 显示当前列当前目录下的所有文件;
n        clear命令
clear命令是用来清除当前屏幕显示的,不需任何参数,和dos下的cls命令功能相同。

参数

文件:指定要分屏显示内容的文件。

more 全屏幕的方式按页显示文本文件的内容, 只能向前浏览

more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。

该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--(XX%)可以用下列不同的方法对提示做出回答:

  • 按Space键:显示文本的下一屏内容。

  • 按Enier键:只显示文本的下一行内容。

  • 按斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。

  • 按H键:显示帮助屏,该屏上有相关的帮助信息。

  • 按B键:显示上一屏内容。

  • 按Q键:退出rnore命令。

Grammar

more (Grammar) (参数)

选项

  • -<数字>:指定每屏显示的行数;
  • -d:显示"[press space to continue,\'q\' to quit.]"和"[Press \'h\' for instructions]";
  • -c:不进行滚屏操作。每次刷新这个屏幕;

  • -s:将多个空行压缩成一行显示;

  • -u:禁止下划线;

  • +<数字>:从指定数字的行开始显示。

参数

文件:指定分页显示内容的文件。

Living Example

显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。

more -dc file

显示文件file的内容,每10行显示一次,而且在显示之前先清屏。

more -c -10 file

nl 读取 file 参数(缺省情况下标准输入),计算输入中的行号

nl命令读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。在输出中,nl命令根据您在命令行中指定的标志来计算左边的行。输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。除非使用-p选项,nl命令在每个逻辑页开始的地方重新设置行号。可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。其默认的结果与cat -n有点不太一样,nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能。

Grammar

nl (选项) (参数)

选项

-b :指定行号指定的方式,主要有两种:
    -b a :表示不论是否为空行,也同样列出行号(类似 cat -n)    -b t :如果有空行,空的那一行不要列出行号(默认值);

-n :列出行号表示的方法,主要有三种:
    -n ln :行号在萤幕的最左方显示;
    -n rn :行号在自己栏位的最右方显示,且不加 0     -n rz :行号在自己栏位的最右方显示,且加 0 ;

-w :行号栏位的占用的位数。
-p :在逻辑定界符处不重新开始计算。

Living Example

nl列出 log2015.log 的内容

[root@localhost test]# nl log2015.log
1 2015-01
2 2015-02


3 ======[root@localhost test]#

说明:文件中的空白行,nl不会加上行号

用 nl 列出 log2015.log 的内容,空本行也加上行号

[root@localhost test]# nl -b a log2015.log
1 2015-01
2 2015-02
3
4
5 ======[root@localhost test]#

让行号前面自动补上0,统一输出格式:

[root@localhost test]# nl -b a -n rz log2015.log
000001 2015-01
000002 2015-02
000003 2015-03
000004 2015-04
000005 2015-05
000006 2015-06
000007 2015-07
000008 2015-08
000009 2015-09
000010 2015-10
000011 2015-11
000012 2015-12
000013 =======
[root@localhost test]# nl -b a -n rz -w 3 log2015.log
001 2015-01
002 2015-02
003 2015-03
004 2015-04
005 2015-05
006 2015-06
007 2015-07
008 2015-08
009 2015-09
010 2015-10
011 2015-11
012 2015-12
013 =======

说明:nl -b a -n rz命令行号默认为六位,要调整位数可以加上参数-w 3调整为3位。

rev 每行内容以字符为单位反序输出

将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。

把文件每行都左右反转

$ echo -e "abc\ndef" | rev
cba
fed

# 列出目录树下所有的不包含文件夹路经的文件名。原理是通过两个rev,实际上cut出来了按照'/'切分的最后一段。
$ find . -type f | rev | cut -d'/' -f1 | rev 

hexdump 查看"二进制"文件的十六进制编码

hexdump命令一般用来查看"二进制"文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。

Grammar

hexdump [Option] [文件]...

选项

  • -n length 只格式化输入文件的前length个字节。

  • -C 输出规范的十六进制和ASCII码。

  • v选项使hexdump显示所有输入数据。

  • -b 单字节八进制显示。

  • -c 单字节字符显示。

  • -d 双字节十进制显示。

  • -o 双字节八进制显示。

  • -x 双字节十六进制显示。

  • -s 从偏移量开始输出。

  • -e 指定格式字符串,格式字符串包含在一对单引号中,格式字符串形如:\'a/b "format1" "format2"\'。每个格式字符串由三部分组成,每个由空格分隔,第一个形如a/b,b表示对每b个输入字节应用format1格式,a表示对每a个输入字节应用format2格式,一般a>b,且b只能为1,2,4,另外a可以省略,省略则a=1。format1和format2中可以使用类似printf的格式字符串,如:

  • %02d:两位十进制

  • %03x:三位十六进制

  • %02o:两位八进制

  • %c:单个字符等

  • 还有一些特殊的用法:

  • %_ad:标记下一个输出字节的序号,用十进制表示。

  • %_ax:标记下一个输出字节的序号,用十六进制表示。

  • %_ao:标记下一个输出字节的序号,用八进制表示。

  • %_p:对不能以常规字符显示的用.代替。

  • 同一行如果要显示多个格式字符串,则可以跟多个-e选项。

Living Example

hexdump -e '16/1 "%02X " "  |  "' -e '16/1 "%_p" "\n"' test
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  |  ................  
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  |  ................  
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F  |   !"#$%&'()*+,-./ 


Living Example:查看MBR的512字节信息
[root@test-6]#hexdump -C /dev/sda -n 512 -v

od 不能直接显示在终端的字符

od命令用于输出文件的八进制、十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符。

常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

Grammar

od(选项)(参数)

选项

  • -a:此参数的效果和同时指定"-ta"参数相同;

  • -A:<字码基数>:选择以何种基数计算字码;

  • -b:此参数的效果和同时指定"-toC"参数相同;

  • -c:此参数的效果和同时指定"-tC"参数相同;

  • -d:此参数的效果和同时指定"-tu2"参数相同;

  • -f:此参数的效果和同时指定"-tfF"参数相同;

  • -h:此参数的效果和同时指定"-tx2"参数相同;

  • -i:此参数的效果和同时指定"-td2"参数相同;

  • -j<字符数目>或--skip-bytes=<字符数目>:略过设置的字符数目;

  • -l:此参数的效果和同时指定"-td4"参数相同;

  • -N<字符数目>或--read-bytes=<字符数目>:到设置的字符树目为止;

  • -o:此参数的效果和同时指定"-to2"参数相同;

  • -s<字符串字符数>或--strings=<字符串字符数>:只显示符合指定的字符数目的字符串;

  • -t<输出格式>或--format=<输出格式>:设置输出格式;

  • -v或--output-duplicates:输出时不省略重复的数据;

  • -w<每列字符数>或--width=<每列字符数>:设置每列的最大字符数;

  • -x:此参数的效果和同时指定"-h"参数相同;

  • --help:在线帮助;

  • --version:显示版本信息。

参数

文件:指定要显示的文件。

Living Example

[linuxde@localhost ~]$ echo abcdef g > tmp
[linuxde@localhost ~]$ cat tmp
abcdef g
说明:先准备一个tmp文件

[linuxde@localhost ~]$ od -b tmp
0000000 141 142 143 144 145 146 040 147 012
0000011
说明:使用单字节八进制解释进行输出, 注意左侧的默认地址格式为八字节

[linuxde@localhost ~]$ od -c tmp
0000000   a   b   c   d   e   f       g  \n
0000011
说明:使用ASCII码进行输出, 注意其中包括转义字符

[linuxde@localhost ~]$ od -t d1 tmp
0000000   97   98   99  100  101  102   32  103   10
0000011
说明:使用单字节十进制进行解释

[linuxde@localhost ~]$ od -A d -c tmp
0000000   a   b   c   d   e   f       g  \n
0000009
说明:设置地址格式为十进制。

[linuxde@localhost ~]$ od -A x -c tmp
000000   a   b   c   d   e   f       g  \n
000009
说明:设置地址格式为十六进制

[linuxde@localhost ~]$ od -j 2 -c tmp
0000002   c   d   e   f       g  \n
0000011
说明:跳过开始的两个字节

[linuxde@localhost ~]$ od -N 2 -j 2 -c tmp
0000002   c   d
0000004
说明:跳过开始的两个字节,并且仅输出两个字节

[linuxde@localhost ~]$ od -w1 -c tmp
0000000   a
0000001   b
0000002   c
0000003   d
0000004   e
0000005   f
0000006   
0000007   g
0000010  \n
0000011
说明:每行仅输出1个字节
[linuxde@localhost ~]$ od -w2 -c tmp
0000000   a   b
0000002   c   d
0000004   e   f
0000006       g
0000010  \n
0000011
说明:每行输出两个字节

[linuxde@localhost ~]$ od -w3 -b tmp
0000000 141 142 143
0000003 144 145 146
0000006 040 147 012
0000011

touch 创建空文件和如果存在文件时则更改文件时间

  • 文件名可以使用除/以外的的任意字符,但是总长度不能超过255字节

touch命令有两个功能:

  1. ​ 用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;
  2. ​ 用来创建新的空文件

Grammar

touch [OPTION]... FILE...
touch(Option)(参数)

选项

  • -a:或--time=atime或--time=access或--time=use 仅仅更改访问时间;

  • -m:或--time=mtime或--time=modify 仅仅变更"修改"的时间;

  • -c或者-h:或--no-create 不建立任何文件;

  • -t:<日期时间> 使用指定的日期时间替代当前时间;touch -t 201709160906.50 testc.txt

在这里,-t后面所带的时间戳的格式为:

[[CC]YY]MMDDhhmm [.SS]
具体来讲,是这样的:

CC - 年份的前两位 
YY - 年份的后两位 
MM - 月份 [01-12]
DD - 日期 [01-31]
hh -  [00-23]
mm -  [00-59]
SS -  [00-61]
  • -d:<时间日期> 使用字符串替代当前时间;
  • -r:<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
  • -f:此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;

  • --help:在线帮助;

  • --version:显示版本信息。

参数

文件:指定要设置时间属性的文件列表。

Living Example

[root@test ~]# touch -d 20181010 date   使用字符串替代当前时间
[root@test ~]# stat date 
  文件:"date"
  大小:12         块:8          IO 块:4096   普通文件
设备:fd00h/64768d Inode:8425878     硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2018-10-10 00:00:00.000000000 +0800
最近更改:2018-10-10 00:00:00.000000000 +0800
最近改动:2018-12-27 12:13:09.567129910 +0800

[root@test ~]# touch -d 2018-10-10 date     使用字符串替代当前时间
[root@test ~]# stat date 
  文件:"date"
  大小:12         块:8          IO 块:4096   普通文件
设备:fd00h/64768d Inode:8425878     硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2018-10-10 00:00:00.000000000 +0800
最近更改:2018-10-10 00:00:00.000000000 +0800
最近改动:2018-12-27 12:13:49.536868034 +0800
-----------------------------------------------------------
[root@test-6 tmp]# stat xx.txt 
  File: "xx.txt"
  Size: 8           Blocks: 8          IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 399217      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-01-02 18:07:59.541451731 +0800
Modify: 2019-01-02 18:05:35.674446464 +0800
Change: 2019-01-02 18:07:59.541451731 +0800
[root@test-6 tmp]# touch -t 201901010909.50 xx.txt 
[root@test-6 tmp]# stat xx.txt 
  File: "xx.txt"
  Size: 8           Blocks: 8          IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 399217      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-01-01 09:09:50.000000000 +0800
Modify: 2019-01-01 09:09:50.000000000 +0800
Change: 2019-01-02 18:15:02.305444501 +0800
------------------------------------------------------
[root@test-6 tmp]# stat xx.txt 
  File: "xx.txt"
  Size: 8           Blocks: 8          IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 399217      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-01-02 18:28:35.250446525 +0800
Modify: 2019-01-01 09:09:50.000000000 +0800
Change: 2019-01-02 18:28:35.250446525 +0800
[root@test-6 tmp]# date 
2019年 01月 02日 星期三 18:30:34 CST
[root@test-6 tmp]# touch -a xx.txt 
[root@test-6 tmp]# stat xx.txt 
  File: "xx.txt"
  Size: 8           Blocks: 8          IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 399217      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-01-02 18:31:11.462443413 +0800
Modify: 2019-01-01 09:09:50.000000000 +0800
Change: 2019-01-02 18:31:11.462443413 +0800

利用输出重定向创建空文件: > 输出重定向

[root@test-6 tmp]# > a.txt
[root@test-6 tmp]# cat a.txt

利用输出重定向清空文件里面的内容:

cat /dev/null > /etc/test.txt

或者直接重定向:

> filename

说明:Linux里面不能有重名的文件或者目录(即使是文件与目录同名也不行)

mkdir 用来创建目录

mkdir命令用来创建目录。该命令创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录;如果给出了一个已经存在的路径,将会在该目录下创建一个指定的目录。在创建目录时,应保证新建的目录与它所在目录下的文件没有重名。 

注意:在创建文件时,不要把所有的文件都存放在主目录中,可以创建子目录,通过它们来更有效地组织文件。最好采用前后一致的命名方式来区分文件和目录。例如,目录名可以以大写字母开头,这样,在目录列表中目录名就出现在前面。

在一个子目录中应包含类型相似或用途相近的文件。例如,应建立一个子目录,它包含所有的数据库文件,另有一个子目录应包含电子表格文件,还有一个子目录应包含文字处理文档,等等。目录也是文件,它们和普通文件一样遵循相同的命名规则,并且利用全路径可以唯一地指定一个目录。

Grammar

mkdir (选项) (参数)

选项

  • -m<目标属性>或--mode<目标属性> 建立目录的同时设置目录的权限;
  • -p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;(递归创建)
  • -v:显示创建过程

  • -Z:设置安全上下文,当使用SELinux时有效;

  • --version 显示版本信息。

参数

目录:指定要创建的目录列表,多个目录之间用空格隔开。

Living Example

在目录/usr/meng下建立子目录test,并且只有文件主有读、写和执行权限,其他人无权访问

mkdir -m 700 /usr/meng/test

在当前目录中建立bin和bin下的os_1目录,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问

mkdir -p -m 750 bin/os_1

多层文件

mkdir -pv 父文件夹/{子文件夹1,子文件2,子文件3}
[root@test-6 tmp]# mkdir file{1..9}     #(创建file1至file9)
[root@test-6 tmp]# ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

创建目录:a_c a_d b_c b_d

[root@test-6 tmp]# mkdir a_{c,d} b_{c,d}
[root@test-6 tmp]# ls
a_c  a_d  b_c  b_d

一条命令创建目录a_c 、 b_c 、 a_d 、 b_d

[root@test-6 tmp]# mkdir -pv a_c  a_d  b_c  b_d
mkdir: 已创建目录 "a_c"
mkdir: 已创建目录 "a_d"
mkdir: 已创建目录 "b_c"
mkdir: 已创建目录 "b_d"
[root@test-6 tmp]# ls
a_c  a_d  b_c  b_d
[root@test-6 tmp]# mkdir -pv x/{a/{m,n},b}
mkdir: 已创建目录 "x"
mkdir: 已创建目录 "x/a"
mkdir: 已创建目录 "x/a/m"
mkdir: 已创建目录 "x/a/n"
mkdir: 已创建目录 "x/b"
[root@test-6 tmp]# tree x
x
├── a
│   ├── m
│   └── n
└── b
mkdir -pv tmp/mysysroot/{bin,etc/sysconfig/network-scripts,sbin,usr/{bin,lib,lib64,local/{bin,etc,lib,sbin},sbin},var/{cache,log,run}}
[root@test-6 tmp]# tree tmp/

tmp/
└── mysysroot
    ├── bin
    ├── etc
       ├── aa
       └── sysconfig
           └── network-scripts
    ├── sbin
    ├── usr
       ├── bin
       ├── lib
       ├── lib64
       ├── local
          ├── bin
          ├── etc
          ├── lib
          └── sbin
       └── sbin
    └── var
        ├── cache
        ├── log
        └── run

21 directories, 0 files

以当前时间创建 (2种)

[root@test-6 tmp]# mkdir `date +%F`
[root@test-6 ~]# mkdir -pv $(date +%F)
mkdir: 已创建目录 "2018-12-28"

cp 复制,复制过程中也可以重新命名

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。

Grammar

cp (选项) (参数)

选项

  • -R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
  • -f:强行复制文件或目录,不论目标文件或目录是否已存在;

  • -a:此参数的效果和同时指定"-dpR"参数相同;

  • -p:保留源文件或目录的属性;

  • -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;

  • -b:覆盖已存在的文件目标前将目标文件备份;

  • -i:覆盖既有文件之前先询问用户;

  • -l:对源文件建立硬连接,而非复制文件;

  • -s:对源文件建立符号连接,而非复制文件;

  • -u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;

  • -S:在备份文件时,用指定的后缀SUFFIX代替文件的默认后缀;

  • -v:详细显示命令执行的操作。

参数

  • 源文件:制定源文件列表。默认情况下,cp命令不能复制目录,如果要复制目录,则必须使用-R选项;

  • 目标文件:指定目标文件。当"源文件"为多个文件时,要求"目标文件"为指定的目录。

Living Example

如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。通常会用到点.或点点..的形式。例如,下面的命令将指定文件复制到当前目录下:

cp ../mary/homework/assign .

特殊用法:利用cp备份当前目录的文件

#(其实这个适合于长路径下)
#cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.backup}
#cd /etc/sysconfig/network-scripts
#ls
ifcfg-eth0 ifcfg-eth0.backup
# 复制文件到目标路径是已存在的解决方法
[root@k8s ~]# cp cfg.yaml /tmp/
#第一种
[root@k8s ~]# cp cfg.yaml /tmp/
cp: overwrite ‘/tmp/cfg.yaml’? y
#第二种
[root@k8s ~]# \cp cfg.yaml /tmp/
#第三种
[root@k8s ~]# /bin/cp cfg.yaml /tmp/

install 备份、安装或升级软件

原文链接:https://blog.csdn.net/chenghuikai/article/details/72471414

介绍:

install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户。install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile,使用它来将程序拷贝到目标(安装)目录。

语法:

install [OPTION] [-T] SOURCE DEST
install [OPTION] SOURCE… DIRECTORY
install [OPTION] -t DIRECTORY SOURCE…
install [OPTION] -d DIRECTORY…
#如果给两个文件名,复制第一个文件到第二个
#如果给出了-t选项,或者如果最后一个文件是目录,并且没有给出-T选项,那么“install”将使用SOURCE的名称将每个SOURCE文件复制到指定的目录
#如果给出了-d选项,install会以755的权限创建每个目录,而不管-m选项指定的权限或者当前的umask,注意:目录Setuid和Setgid ::,用于如何继承父目录的set-user-ID和set-group-ID位
#在前两种格式中,会将<来源>复制到<目的地>或将多个<来源>文件复制到已存在的<目录>,同时设定权限模式及所有者/所属组。
#在第三种格式中,会创建所有指定的目录及它们的主目录。
#长选项必须用的参数,在使用短选项时也是必须的

选项:

  • --backup[=CONTROL]: 为每个已存在 的目的地文件进行备份
  • -b: 类似--backup,但不接受任何参数

  • -c: 此选项不作处理,man文档里写的是ignored

  • -D, --compare:比较每对源文件和目标文件,如果目的地具有相同的内容和任何指定的所有者,组,权限以及可能的SELinux上下文,那么不要修改目的地

  • -d, --directory:所有参数都作为目录处理,而且会创建指定目录的所有主目录

  • -D: 创建<目的地>前的所有主目录,然后将<来源>复制至<目的地>;在第一种格式中有用

  • -g, --group=组: 自行设定所属组,而不是进程目前的所属组

  • -m, --mode=模式: 自行设定权限模式,(像chmod),而不是rwxr-xr-x

  • -o, --owner: 自行设定权限所有者(只适用于超级用户)

  • -p,--preserve-timestamp:以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性

  • -s, --strip: 用strip命令删除symbol table,只适用于第一及第二种格式

  • -S, --suffix=后缀: 自定指定备份文件的后缀

  • -v, --verbose: 处理每个文件/目录时印出名称

  • -Z CONTEXT, --context=CONTEXT:设置要用于任何创建的文件和目录的默认SELinux安全上下文。如果SELinux被禁用,则打印警告并忽略该选项

  • --help:显示此帮助信息并离开

  • --version: 显示版本信息并离开

image-20220616113201931

实例:

install -d [选项] DIRECTORY [DIRECTORY…]
支持多个,类似mkdir -p,支持递归。例如:install -d /a/b/c e/f结果和mkdir -p a/b/c e/f一样

install [选项] SOURCE DEST
复制SOURCE文件(测试不能是目录)到DEST(文件):

install a/e c #结果类似:cp a/e c #注意c必须是文件
-D选项:
install -D x a/b/c #类似于mkdir -p a/b && cp x /a/b/c

复制多个SOURCE文件到目的目录
install a/* d #其中d是目录

install和cp的区别?

install复制时可以指定权限,cp不可以

Living Example:

[root@test6 opt]# install -m 777 /etc/passwd /opt/passwd.backup
[root@test6 opt]# ll
-rwxrwxrwx. 1 root root 902 1月 8 18:48 passwd.backup

mv 移动目录或对目录重新命名

mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。

mv命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果:

  1. 如果目标文件是到某一目录文件的路径,源文件会被移到此目录下,且文件名不变。

  2. 如果目标文件不是目录文件,则源文件名(只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv的作用就是改文件名。当目标文件是目录文件时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标文件中。所有移到该目录下的文件都将保留以前的文件名。

注意事项:mv与cp的结果不同,mv好像文件"搬家",文件个数并未增加。而cp对文件进行复制,文件个数增加了。

Grammar

mv (选项) (参数)

选项

  • --backup=<备份模式>:若需覆盖文件,则覆盖前先行备份;
  • -b:当文件存在时,覆盖前,为其创建一个备份;

  • -f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;

  • -i:交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入"y",表示将覆盖目标文件;输入"n",表示取消对源文件的移动。这样可以避免误将文件覆盖。

  • --strip-trailing-slashes:删除源文件中的斜杠"/";

  • -S<后缀>:为备份文件指定后缀,而不使用默认的后缀;

  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

  • --target-directory=<目录>:指定源文件要移动到目标目录;

参数

  • 源文件:源文件列表。
  • 目标文件:如果"目标文件"是文件名则在移动文件的同时,将其改名为"目标文件";如果"目标文件"是目录名则将源文件移动到"目标文件"下。

Living Example

将文件ex3改名为new1

mv ex3 new1

将目录/usr/men中的所有文件移到当前目录(用.表示)中:

mv /usr/men/* .

将目录/boot/grub/中的所有文件移动到/opt/目录下(无交互式,如果/opt里面有,直接覆盖)

[root@CentOS]# \mv /boot/grub/ /opt/

rename 用字符串替换的方式批量改变文件名

rename命令用字符串替换的方式批量改变文件名。

Grammar

rename (参数)

参数

原字符串:将文件名需要替换的字符串;

目标字符串:将文件名中含有的原字符替换成目标字符串;

文件:指定要改变文件名的文件列表。

Living Example

将main1.c重命名为main.c

rename main1.c main.c main1.c

rename支持通配符

  • ?可替代单个字符
  • *可替代多个字符
  • [charset]可替代charset集中的任意单个字符

文件夹中有这些文件

foo1, ..., foo9, foo10, ..., foo278

如果使用

rename foo foo0 foo?

会把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,文件名中的foo被替换为foo0。

如果使用

rename foo foo0 foo??

foo01到foo99的所有文件都被重命名为foo001到foo099,只重命名5个字符长度名称的文件,文件名中的foo被替换为foo0

如果使用

rename foo foo0 foo*

foo001到foo278的所有文件都被重命名为foo0001到foo0278,所有以foo开头的文件都被重命名。

如果使用

rename foo0 foo foo0[2]*

从foo0200到foo0278的所有文件都被重命名为foo200到foo278,文件名中的foo0被替换为foo。

rename支持正则表达式

字母的替换
rename "s/AA/aa/" *  //把文件名中的AA替换成aa
修改文件的后缀
rename "s//.html//.php/" *     //把.html 后缀的改成 .php后缀
批量添加文件后缀
rename "s/$//.txt/" *     //把所有的文件名都以txt结尾
批量删除文件名
rename "s//.txt//" *      //把所有以.txt结尾的文件名的.txt删掉

rm 删除 (默认是rm -i)

rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。

注意:使用rm命令要格外小心。因为一旦删除了一个文件,就无法再恢复它。所以,在删除文件之前,最好再看一下文件的内容,确定是否真要删除。rm命令可以用-i选项,这个选项在使用文件扩展名字符删除多个文件时特别有用。使用这个选项,系统会要求你逐一确定是否要删除。这时,必须输入y并按Enter键,才能删除文件。如果仅按Enter键或其他字符,文件不会被删除。

Grammar

rm [OPTION]... FILE...
rm (Option)(参数)

选项

  • -f:强制删除文件或目录;(相当于没有提示信息就可以删除;非交互式)

  • -r或-R:递归处理,将指定目录下的所有文件与子目录一并处理;

  • -d:直接把欲删除的目录的硬连接数据删除成0,删除该目录;

  • -i:删除已有文件或目录之前先询问用户;

  • --preserve-root:不对根目录进行递归操作;

  • -v:显示指令的详细执行过程。

参数

文件:指定被删除的文件列表,如果参数中含有目录,则必须加上-r或者-R选项。

Living Example

交互式删除当前目录下的文件test和example
rm -i test example
Remove test ?n(不删除文件test)
Remove example ?y(删除文件example)
删除当前目录下除隐含文件外的所有文件和子目录

[root@test-6 ~]# rm -r qwsa/        (交互式删除目录)
rm:是否删除目录 "qwsa"?y

# rm -r * 注意,这样做是非常危险的!

[root@test-6 ~]# rm -rf qaz/            (加一个”f”,删除时,不会提示删除信息)
[root@test-6 ~]# \rm -r [a-z].txt/      (前面加一个转义符”\”,也不会提示删除信息)
[root@test-6 ~]# /bin/rm -r tools       (前面加执行命令的全路径,也不会提示删除信息)

rmdir 用来删除空目录

rmdir命令用来删除空目录。当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录。利用rmdir命令可以从一个目录中删除一个或多个空的子目录。该命令从一个目录中删除一个或多个子目录,其中dirname佬表示目录名。如果dirname中没有指定路径,则删除当前目录下由dirname指定的目录;如dirname中包含路径,则删除指定位置的目录。删除目录时,必须具有对其父目录的写权限。

注意:子目录被删除之前应该是空目录。就是说,该目录中的所有文件必须用rm命令全部,另外,当前工作目录必须在被删除目录之上,不能是被删除目录本身,也不能是被删除目录的子目录。

虽然还可以用带有-r选项的rm命令递归删除一个目录中的所有文件和该目录本身,但是这样做存在很大的危险性。

Grammar

rmdir(选项)(参数)

选项

  • -p或--parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除;

  • --ignore-fail-on-non-empty:此选项使rmdir命令忽略由于删除非空目录时导致的错误信息;

  • -v或-verboes:显示命令的详细执行过程;

  • --help:显示命令的帮助信息;

  • --version:显示命令的版本信息。

参数

目录列表:要删除的空目录列表。当删除多个空目录时,目录名之间使用空格隔开。

Living Example

删除子目录os_1和其父目录bin

cd /usr/meng/test
rmdir -p bin/os_1

查询各种东西的方法:

which 查找并显示给定命令的绝对路径?且只能查找可执行文件

which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量\$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

Grammar

which(选项)(参数)

选项

  • --all,-a:显示完整的路径

  • -n<文件名长度>:制定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名;

  • -p<文件名长度>:与-n参数相同,但此处的<文件名长度>包含了文件的路径;

  • -w:指定输出时栏位的宽度;

  • -V:显示版本信息。

参数

指令名:指令名列表。

Living Example

查找文件、显示命令绝对路径:

[root@localhost ~]# which pwd       (显示pwd命令的绝对路径)
/bin/pwd
[root@localhost ~]# which adduser
/usr/sbin/adduser

显示scp命令的绝对路径,在结合rpm -qf查处该命令的软件包名

[root@localhost ~]# which scp
/usr/bin/scp
[root@localhost ~]# rpm -qf /usr/bin/scp
openssh-clients-5.3p1-94.el6.x86_64

说明:

1、which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!

2、which 只能查可执行文件

image-20220616123252270

whereis 定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

Grammar

whereis(选项)(参数)

选项

  • -b:只查找二进制文件;
  • -m:只查找说明文件;

  • -s:只查找原始代码文件;

  • -B<目录>:只在设置的目录下查找二进制文件;

  • -f:不显示文件名前的路径名称;

  • -M<目录>:只在设置的目录下查找说明文件;

  • -S<目录>只在设置的目录下查找原始代码文件;

  • -u:查找不包含指定类型的文件。

参数

指令名:要查找的二进制程序、源文件和man手册页的指令名。

Living Example

将相关的文件都查找出来

[root@localhost ~]# whereis tomcat
tomcat: nothing appropriate 

[root@localhost ~]# whereis svn
svn: /usr/bin/svn /usr/local/svn /usr/share/man/man1/svn.1.gz

说明:tomcat没安装,找不出来,svn安装找出了很多相关文件


**只将二进制文件查找出来 **

[root@localhost ~]# whereis -b svn      (只查找二进制文件)
svn: /usr/bin/svn /usr/local/svn

[root@localhost ~]# whereis -m svn      (只查找说明文件)
svn: /usr/share/man/man1/svn.1.gz

[root@localhost ~]# whereis -s svn      (只查原始代码文件)
svn:

说明:

whereis -b  svn 只查找二进制文件
whereis -m svn查出说明文档路径,
whereis -s svn找source源文件。

whatis 查询一个命令执行什么功能,并将查询结果打印到终端上

怎样查看一个linux命令的概要与用法?假设你在/bin目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?

whatis命令是用于查询一个命令执行什么功能,并将查询结果打印到终端上。

whatis命令在用catman -w命令创建的数据库中查找command参数指定的命令、系统调用、库函数或特殊文件名。whatis命令显示手册部分的页眉行。然后可以发出man命令以获取附加的信息。whatis命令等同于使用man -f命令。

使用命令whatis 可以先出显示出这个命令的用法简要,比如,你可以使用whatis zcat 去查看'zcat'的介绍以及使用简要。

Grammar

whatis keyword

Living Example

[root@localhost ~]# whatis ls
ls                   (1)  - list directory contents
ls                   (1p)  - list directory contents
[root@localhost ~]# whatis chown
chown                (1)  - change file owner and group
chown                (1p)  - change the file ownership
chown                (2)  - change ownership of a file
chown                (3p)  - change owner and group of a file

[root@localhost ~]# whatis man
man                  (1)  - format and display the on-line manual pages
man                  (1p)  - display system documentation
man                  (7)  - macros to format man pages
man                 (rpm) - A set of documentation tools: man, apropos and whatis.
man-pages           (rpm) - Man (manual) pages from the Linux Documentation Project.
man.config [man]     (5)  - configuration data for man

[root@localhost ~]# whatis zcat
zcat [gzip] (1)  compress or expand files

locate 和slocate 都用来查找文件或目录

locate命令和slocate命令都用来查找文件或目录。

locate命令其实是find -name的另一种写法,但是要比find快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。

Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

Grammar

locate /slocate (选项) (参数)

选项

  • -A, --all 只显示匹配所有模式的条目

  • -b, --basename 只匹配路径名的基本名称

  • -c, --count 只显示找到的条目的数目

  • -d, --database DBPATH 使用DBPATH,而非默认数据(即:/var/lib/mlocate/mlocate.db)

  • -e, --existing 只显示当前存在的文件条目

  • -L, --follow 当文件存在时跟随蔓延的符号链接(默认)

  • -h, --help 显示帮助信息

  • -i, --ignore-case 匹配模式时忽略大小写区别

  • -l, --limit, -n LIMIT 限制为 LIMIT项目的输出(或 计数)

  • -m, --mmap 被忽略,用于向后兼容

  • -P, --nofollow, -H 当检查文件时不跟随蔓延的符号链接

  • -0, --null 输出时以 NUL 分隔项目

  • -S, --statistics 不搜索项目,显示有关每个已用数据库的统计信息

  • -q, --quiet 不报告关于读取数据库的错误消息

  • -r, --regexp REGEXP 搜索基本正则表达式 REGEXP 而不是模式

  • --regex 模式是扩展正则表达式

  • -s, --stdio 被忽略,用于向后兼容

  • -V, --version 显示版本信息

  • -w, --wholename 匹配完整路径名(默认)

参数

查找字符串:要查找的文件名中含有的字符串。

Living Example

搜索etc目录下所有以sh开头的文件:

locate /etc/sh

搜索用户主目录下,所有以m开头的文件:

locate ~/m

搜索用户主目录下,所有以m开头的文件,并且忽略大小写:

locate -i ~/m

说明:locate 只加文件名

find 用来在指定目录下查找文件

find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

Grammar

find (选项) (参数)

选项
  • -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
  • -iname<范本样式>:此参数的效果和指定"-name"参数类似,但忽略字符大小写的差别;
  • -size<文件大小>:查找符合指定的文件大小的文件;
  • -type<文件类型>:只寻找符合指定的文件类型的文件;
  • -amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算
  • -atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算
  • -cmin<分钟>:查找在指定时间之时被更改过的文件或目录,单位以分钟计算
  • -ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算
  • -mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算
  • -mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算
  • -newermt<时间戳>:表示搜索修改时间新于给定时间的文件
  • ! -newermt<时间戳>:使用逻辑非符号 ! 排除修改时间新于给定时间的文件
  • -depth:从指定目录下最深层的子目录开始查找;
  • -perm<权限数值>:查找符合指定的权限数值的文件或目录;
  • -expty:寻找文件大小为0Byte的文件,或目录下没有任何子目录或文件的空目录;
  • -exec<执行指令>:假设find指令的回传值为True,就执行该指令;
  • -ok<执行指令>:此参数的效果和指定"-exec"类似,但在执行指令之前会先询问用户,若回答"y"或"Y",则放弃执行命令;
  • -maxdepth<目录层级>:设置最大目录层级
  • -mindepth<目录层级>:设置最小目录层级
  • -used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
  • -mount:此参数的效果和指定"-xdev"相同;
  • -anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
  • -cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
  • -daystart:从本日开始计算时间;
  • -false:将find指令的回传值皆设为False;
  • -fls<列表文件>:此参数的效果和指定"-ls"参数类似,但会把结果保存为指定的列表文件;
  • -follow:排除符号连接;
  • -fprint<列表文件>:此参数的效果和指定"-print"参数类似,但会把结果保存成指定的列表文件;
  • -fprint0<列表文件>:此参数的效果和指定"-print0"参数类似,但会把结果保存成指定的列表文件;
  • -fprintf<列表文件><输出格式>:此参数的效果和指定"-printf"参数类似,但会把结果保存成指定的列表文件;
  • -fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
  • -gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
  • -group<群组名称>:查找符合指定之群组名称的文件或目录;
  • -help或--help:在线帮助;
  • -ilname<范本样式>:此参数的效果和指定"-lname"参数类似,但忽略字符大小写的差别;
  • -iname<范本样式>:此参数的效果和指定"-name"参数类似,但忽略字符大小写的差别;
  • -inum:查找符合指定的inode编号的文件或目录;
  • -ipath<范本样式>:此参数的效果和指定"-path"参数类似,但忽略字符大小写的差别;
  • -iregex<范本样式>:此参数的效果和指定"-regexe"参数类似,但忽略字符大小写的差别;
  • -links<连接数目>:查找符合指定的硬连接数目的文件或目录;
  • -iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
  • -ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
  • -newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
  • -nogroup:找出不属于本地主机群组识别码的文件或目录;
  • -noleaf:不去考虑目录至少需拥有两个硬连接存在;
  • -nouser:找出不属于本地主机用户识别码的文件或目录;
  • -path<范本样式>:指定字符串作为寻找目录的范本样式;
  • -print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有"./"字符串;
  • -print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
  • -printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
  • -prune:不寻找字符串作为寻找文件或目录的范本样式;
  • -regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
  • -true:将find指令的回传值皆设为True;
  • -uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
  • -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
  • -xdev:将范围局限在先行的文件系统中;
  • -version或--version:显示版本信息;
  • -xtype<文件类型>:此参数的效果和指定"-type"参数类似,差别在于它针对符号连接检查。
参数

起始目录:查找文件的起始目录。

Living Example
否定参数

找出/home下不是以.txt结尾的文件

find /home ! -name "*.txt"
根据文件名字
[root@test-6 ~]# find /root/ -name "test"       (具体的文件)
/root/test

[root@CentOS6 ~]# find ./ -name "in*"           (以in开头的所有文件)
./install.log.syslog
./install.log
根据文件类型进行搜索
find . -type 类型参数

类型参数列表:

  • 普通文件

  • 符号连接

  • d 目录

  • 字符设备

  • 块设备

  • 套接字

  • 管道文件

find  . -type d  查找当前路径中的所有目录   (点表示当前路径)
find  . -type f  查找当前路径中的所有文件   (点表示当前路径)
find  . -type l   查找当前路径中的所有符号链接文件  (点表示当前路径)
find  ./ -type f -name "in*"    (type和name结合查找)
根据文件大小进行匹配
find . -type f -size 文件大小单元

文件大小单元:

  • b -- 块(512字节)

  • c -- 字节

  • w -- 字(2字节)

  • k -- 千字节

  • M -- 兆字节

  • G -- 吉字节

搜索大于10KB的文件

find . -type f -size +10k

搜索小于10KB的文件

find . -type f -size -10k

搜索等于10KB的文件

find . -type f -size 10k
基于目录深度搜索

向下最大深度限制为3

find . -maxdepth 3 -type f

搜索出深度距离当前目录至少2个子目录的所有文件

find . -mindepth 2 -type f
根据文件时间戳进行搜索
find . -type f 时间戳

UNIX/Linux文件系统每个文件都有三种时间戳:

  • 访问时间(-atime/天,-amin/分钟):文件内容被取用时;用户最近一次访问时间。可以使用touch命令更改为当前时间

  • 修改时间(-mtime/天,-mmin/分钟):文件内容更改;最后一次修改时间。修改动作可以使echo重定向、vi等等

  • 变化时间(-ctime/天,-cmin/分钟):文件状态改变时的时间;文件数据元(例如权限等)最后一次修改时间。变更动作可以使chmod、chgrp、mv等等

搜索最近七天内被访问过的所有文件

find . -type f -atime -7

搜索恰好在七天前被访问过的所有文件

find . -type f -atime 7

搜索超过七天内被访问过的所有文件

find . -type f -atime +7

搜索访问时间超过10分钟的所有文件

find . -type f -amin +10

找出比file.log修改时间更长的所有文件

find . -type f -newer file.log
根据时间段查找文件

示例,用于在11:00至12:00之间查找文件:

find /path/to/search -type f -newermt "2023-10-13 11:00:00" ! -newermt "2023-10-13 12:00:00"

解释一下上述命令:

  • /path/to/search 是要搜索的目录路径,你可以根据实际情况进行替换。
  • -type f 表示只搜索普通文件,排除目录等其他文件类型。
  • -newermt "2023-10-13 11:00:00" 表示搜索修改时间新于给定时间的文件。在这里,我们指定的是11:00之后的文件。
  • ! -newermt "2023-10-13 12:00:00" 使用逻辑非符号 ! 排除修改时间新于给定时间的文件。这样,我们就限制了搜索范围为11:00至12:00之间。
根据文件权限/所有权进行匹配

当前目录下搜索出权限为777的文件

find . -type f -perm 777

找出当前目录下权限不是644的php文件

find . -type f -name "*.php" ! -perm 644

找出当前目录用户tom拥有的所有文件

find . -type f -user tom

找出当前目录用户组sunk拥有的所有文件

find . -type f -group sunk
根据文件或者正则表达式进行匹配

列出当前目录及子目录下所有文件和文件夹

find .

/home目录下查找以.txt结尾的文件名

find /home -name "*.txt"

同上,但忽略大小写

find /home -iname "*.txt"

当前目录及子目录下查找所有以.txt.pdf结尾的文件

find . \( -name "*.txt" -o -name "*.pdf" \)
# 或
find . -name "*.txt" -o -name "*.pdf" 

匹配文件路径或者文件

find /usr/ -path "*local*"

基于正则表达式匹配文件路径

find . -regex ".*\(\.txt\|\.pdf\)$"

同上,但忽略大小写

find . -iregex ".*\(\.txt\|\.pdf\)$"
删除匹配文件

删除当前目录下所有.txt文件

find . -type f -name "*.txt" -delete
借助-exec选择与其他命令结合使用

找出当前目录下所有root的文件,并把所有权更改为用户tom

find .-type f -user root -exec chown tom {} \;

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。

找出自己家目录下所有的.txt文件并删除

find $HOME/. -name "*.txt" -ok rm {} \;

上例中,-ok-exec行为一样,不过-ok它会给出提示,是否执行相应的操作。

查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt

将30天前的.log文件移动到old目录中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出当前目录下所有.txt文件并以"File:文件名"的形式打印出来

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令

-exec ./text.sh {} \;
搜索但跳出指定的目录

查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk

find . -path "./sk" -prune -o -name "*.txt" -print
find其他技巧收集

要列出所有长度为零的文件

find . -empty

命令解释:查找/var/muses下,以tm_打头的目录,中log目录中所有文件去匹配(-mtime后面的是,最近一天内,含有"log"的文件)

find /var/muses/ -regex '/var/muses/tm_.*/log/.*' -mtime -1 -name "*?log*"

一、find后并删除文件

find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

二、find后并将内容清空

find /home/www -name *.log -exec cp /dev/null {} \;
+
或者:find /home/www -name "*.log" | awk '{system("> "$0)}'

find 精简版

Linux命令(七)查找文件或目录 find

find 命令可以根据给定的路劲和表达式查找指定的文件或目录。find 参数选项很多,并且支持正则表达式,功能强大。 和管道结合使用可以实现复杂的功能,是系统管理和普通用户必须掌握的命令。 

一、find  命令格式说明

   path find命令查找的目录路径。
   -print find命令将匹配到的文件输出到标准输出。
   -exec find 命令对匹配的文件执行该参数所给出的Shell命令。
   -ok  -exec的作用相同,只是更安全,在执行每个命令之前,都会给出提示,让用户来确定是否执行。

二、find命令常用参数说明

  -name   按照文件名查找文件
  -cpio: 对匹配的文件使用 cpio 命令,将这些文件备份到磁带设备中
  -prune 按照文件权限进行查找文件 
  -user 按照文件属主来查找文件
  -group 按照文件所属的组来查找文件
  -mtime -n +n 按照文件更改的时间来查找文件,-n 表示更改时间距现在 n 天以内,+n 表示更改时间距现在 n 天以前
   -nogroup 查找无效所属组的文件
   -nouser 查找无效属主文件
   -newer file1 !file2 查找更改时间比 file1 新但比 file2 旧的文件
   -follow 如果 find 查找的为链接文件,就跟踪至连接所指向的文件
   -mount 在查找文件时不跨越文件系统 mount    -fstype 查找位于某一类型文件系统中的文件
   -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
   -size n 查找文件长度为 n 块的文件,带有 c 时表示文件长度以字节计
   -type 查找某一类型的文件
   -amin n 查找系统中最后 n 分钟访问的文件
   -atime n 查找系统中最后 n*24 小时访问的文件
   -cmin n 查找系统中最后 n 分钟被改变文件状态的文件
   -ctime n  查找系统中最后 n*24 小时被改变文件状态的文件
   -mmin n 查找系统中最后 n 分钟被改变文件数据的文件
   -mtime n  查找系统中最后 n*24 小时被改变文件数据的文件
   -empty 查找系统中空白的文件或目录,或目录中没有子目录的文件夹
   -false 查找系统中总是错误的文件
   -gid n 查找系统中文件数字组ID为 n 的文件
   -daystart 测试系统中从今天开始 24 小时以内的文件,用法类似于 -amin
   -help 显示命令摘要(帮助)
   -maxdepth levels 在某个层次目录中按照递减方法查找

三、find基本用法

   find 如不加任何参数,表示查找当前路径下的所有文件和目录
   find  -print    将结果打印到标准输出
   find /data/log   指定路劲查找
  find   /   -name  "abc.txt"   在系统中查找 abc.txt 如果执行完毕没有找到,则说明系统中不存在该文件
   find 还支持正则表达式查找
   find /data/logs -mame "*.log"  -type f -printf    查找符合指定字符串的文件
  find . -name "[0-9]" -type f   查找以数字开头的文件
  find / -mtime -1 |head  查找系统内最近24小时修改过的文件
   find / -mmin  -15|head   查找系统内最近15 分钟修改过的文件

find 使用 type Option可以查找特定的文件类型,常见类型如下
  b 块设备文件
  d 目录
  c 字符设备文件
  p 管道文件
  l 符号链接文件
  f 普通文件
  find  . -type d  查找当前路径中的所有目录
  find  . -type f  查找当前路径中的所有文件
   find  . -type l   查找当前路径中的所有符号链接文件
  更多Living Example将在使用中不断补充.....

四、xargs命令

  find命令可以把匹配到的文件传递给 xargs 命令执行,在使用 find 命令的 -exec Option处理匹配到的文件时,find将所有匹配到的文件一起传递给 exec 执行。由于有些系统对能够传递给 exec 的命令长度有限制,这样会引起溢出错误。这时可以使用 xargs 命令。
  find / type f -print | xargs file    查找系统中的每一个普通文件,并用 file 命令来测试它们分别属于哪一类文件。
  find . -type f -name "\.log" -print | xargs rm  查找当前目录下的 .log 文件,并删除   find . -type f -exec ls -l {} \;   ls -l 列出所有匹配到的文件。
  find logs  -type f -mtime +5 -exec rm {} \;  查找 log 中更改时间在 5 天前的文件并删除。
  find logs -type f -ok rm {} \;  查找 log中的所有普通文件并在删除前确认。  
  find . -type f -name "\.log" -print | gerp "node"     查找当前目录下的 .log 文件,并从查找结果中筛选出带有 node 字符串的文件 

Linux中find命令用法全汇总,看完就没有不会用的!

Linux 查找命令是Linux系统中最重要和最常用的命令之一。查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录列表的命令。查找可以在各种条件下使用,您可以通过权限,用户,组,文件类型,日期,大小等可能的条件查找文件。          通过这篇文章,我们以Living Example的形式分享我们的日常Linux查找命令体验及其用法。在本文中,我们将向您展示Linux中最常用的35查找命令示例。我们将该部分分为五个部分,从基本到提前使用find命令。


  • 第一部分:查找名称查找文件的基本查找命令

  • 第二部分:根据他们的权限查找文件

  • 第三部分:基于所有者和组的搜索文件

  • 第四部分:根据日期和时间查找文件和目录

  • 第五部分:根据大小查找文件和目录


第一部分 - 查找名称查找文件的基本查找命令

1.使用当前目录中的名称查找文件

在当前工作目录中查找名称为passwd.out的所有文件。

[root@CentOS6 tmp]# find passwd.out 
passwd.out

2.在主目录下查找文件

查找/ home目录下的所有文件,名称为test。

[root@CentOS6 tmp]# find /home/ -name test
/home/test

3.使用名称和忽略案例查找文件

找到名称为test的所有文件,并在/home目录中同时包含大写和小写字母。(i表示不区分大小写)

[root@CentOS6 tmp]# find /home/ -iname test
/home/TEST
/home/test

4.使用名称查找目录

在/目录中查找名称为test的所有目录。

[root@CentOS6 tmp]# find / -type d -name test
/home/test
/usr/share/doc/db4-devel-4.7.25/ref/test
/usr/share/doc/ncurses-devel-5.7/test
/usr/local/src/cheat/cheat/test
/usr/local/src/cheat/build/lib/cheat/test
/usr/lib/python2.6/site-packages/cheat/test
/usr/lib/ruby/1.8/test
/usr/lib64/python2.6/test
/tmp/test

5.使用名称查找PHP文件

在当前工作目录中查找名为test.PHP的所有PHP文件。

[root@CentOS6 tmp]# find / -type f -name test.PHP
/home/test/test.PHP

6.查目录中的所有php文件

查找目录中的所有php文件

[root@CentOS6 tmp]# find / -type f -name "*.php"
/home/test/test.php
/usr/lib/rpm/macros.php

第二部分 - 根据他们的权限查找文件

7.查找777个权限的文件

ln 软链接与硬链接

可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是:

硬连接:

  • 是给文件一个副本,原文件名和连接文件名都指向相同的物理地址。目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)文件在磁盘中只有一个拷贝,节省硬盘空间;
  • 修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响
  • 由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除。

符号连接(软连接)

  • ln -s命令建立文件的符号连接符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。

  • 当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。

具体关系可以看下图:

image-20220616142942279

从图上可以看出硬链接和软链接的区别:

1:硬链接原文件和新文件的inode编号一致。而软链接不一样。

2:对原文件删除,会导致软链接不可用,而硬链接不受影响。

3:对原文件的修改,软、硬链接文件内容也一样的修改,因为都是指向同一个文件内容的。

-----------------------------------------------------------------------------------------------------------------------------

ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用-s选项。

注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。

Grammar

ln (选项) (参数)

选项

  • -s或--symbolic:对源文件建立符号连接,而非硬连接;

  • -v或--verbose:显示指令执行过程;

  • 常用组合:ln -sv 原file 链接后的file

  • -b或--backup:删除,覆盖目标文件之前的备份;

  • -f或--force:强行建立文件或目录的连接,不论文件或目录是否存在;

  • -d或-F或--directory:建立目录的硬连接;

  • -i或--interactive:覆盖既有文件之前先询问用户;

  • -n或--no-dereference:把符号连接的目的目录视为一般文件;

  • -S<字尾备份字符串>或--suffix=<字尾备份字符串>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号"~",用户可通过"-S"参数来改变它;

  • -V<备份方式>或--version-control=<备份方式>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-S"参数变更,当使用"-V"参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串;

  • --help:在线帮助;

  • --version:显示版本信息。

参数

  • 源文件:指定连接的源文件。如果使用-s选项创建符号连接,则"源文件"可以是文件或者目录。创建硬连接时,则"源文件"参数只能是文件

  • 目标文件:指定源文件的目标连接文件。

Living Example

1:、创建软连接:(链接的文件或者目录必须带路径)

touch aaa
ln -s aaa aaa1    (aaa是原文件,aaa1是软连接文件)
ls -l aaa1     (查看链接文件:这个是字母l,不是数字1)
ls -l aaa1(快捷方式文件的名称)  查看链接的文件

image-20220616143503213

在目录/usr/liu下建立一个符号链接文件abc,使它指向目录/usr/mengqc/mub1

ln -s /usr/mengqc/mub1 /usr/liu/abc

执行该命令后,/usr/mengqc/mub1代表的路径将存放在名为/usr/liu/abc的文件中。

删除软连接的原文件,结果显示文件为红色了:

[root@test-6 opt]# ls
passwd rh

image-20220616143513094

[root@test-6 opt]# ln -sv rh/ rhlns**
"rhlns" -> "rh/"

[root@test-6 opt]# ls
passwd rh rhlns

image-20220616143529756

image-20220616143555806

删除原文件过后:

image-20220616143603793

删除软链接 ->有创建就有删除,一定不要在最后面加一个 /,否则产生重大事故

rm -rf symbolic_name  #注意不是rm -rf symbolic_name/

image-20230325151454263


2、创建硬链接:

touch bbb

image-20220616143617927

ln bbb bbb1

ln 文件名 复制后文件名字

image-20220616143628479

将目录/usr/mengqc/mub1下的文件m2.c链接到目录/usr/liu下的文件a2.c

cd /usr/mengqc

ln /mub1/m2.c /usr/liu/a2.c

在执行ln命令之前,目录/usr/liu中不存在a2.c文件。执行ln之后,在/usr/liu目录中才有a2.c这一项,表明m2.c和a2.c链接起来( 注意,二者在物理上是同一文件),利用ls -l命令可以看到链接数的变化。


扩展知识

Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。

文件链接有两种形式,即硬链接和符号链接。

硬链接

建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。

创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为l。

在默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理地删除。

对硬链接有如下限制:

  • 不能对目录文件做硬链接。

  • 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。

符号链接

符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件(如图中的abc文件),其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。

image-20220616143651907

与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件。

符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。

ln -s命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。

符号链接保持了链接与源文件或目录之间的区别:

  • 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
  • 在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。
  • 符号链接的大小是其链接文件的路径名中的字节数。
  • 当用ln -s命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file其中,表示"文件大小"的数字"14"恰好说明源文件名original_file由14个字符构成。

免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。