Linux find、tar解压缩等常用命令

一、Linux软硬链接

在Linux中,ln命令会在文件之间创建链接,这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称,看上去就像是Windows的快捷方式。但是,链接分为两种,一种叫作硬链接(Hard Link),另一种叫作符号链接(Symbolic Link),后者又称为软链接。实际上,软链接才真正像是Win中的快捷方式,而硬链接却大有不同。

ln -s source dist # 建立软链接
ln source dist    # 建立硬链接

inode

要想了解软硬链接的区别,就要先明白inode这一概念,这里简单阐述下。

文件储存在硬盘上,硬盘的最小存储单位叫做扇区(Sector),每个扇区储存512字节。操作系统在读取硬盘的时候,不会一个个扇区去读,这样效率太低了,而是一次性连续读取多个扇区,即一次读取一个块(block)。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据都存储的块中,那么很显然,我们还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等,它们能够唯一的标识一个文件。

在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,这种存储文件元信息的区域就叫做inode,中文译名为索引节点。

对于一个文件来说,有唯一的inode与之对应,而对于一个inode而言,可以有多个文件名/路径与之对应。也就是说,一个inode唯一标识一个文件,但是找个文件可以有多种不同的访问路径。这里啰嗦一嘴,Linux下一切皆文件,包括目录、硬盘等等。

可以使用ls -i example.txt来查看某文件的inode编号,同样,可以使用ls -li来查看当前目录下所有文件的inode编号,第一列就是。

软链接

语法:

ln -s target source

ln -s:表示创建一个软连接;
target:表示目标文件(夹)【即被指向的文件(夹)】
source:表示当前目录的软连接名。【源文件(夹)】
ln -s /storage/lawson/scores scor

其含义就是:将scor指向 /storage/lawson/scores/目录下。

这里是当前的scor 指向 /storage/lawson/scores 中。这里显示红色,是因为/storage/lawson/scores这个目录不存在,如果创建该目录,那就可以得到蓝色的显示了。

需要注意的是,当前所有目录下的文件都不能重名,因为我之前有一个文件夹是scores,所以这里就简单的命名成了scor

软连接的删除

rm -rf ./test_chk_ln/ 会删除文件夹下的所有内容,但是没有删除这个链接;
 rm -rf ./test_chk_ln 则是仅删除这个软链接,不会删除下面的内容。 

  • 错误示范
[root@server6 test_chk_ln]# cd ..
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root    22 11月  4 10:41 test_chk
lrwxrwxrwx.  1 root root     9 11月  4 10:42 test_chk_ln -> test_chk/
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# rm -rf ./test_chk_ln/
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root     6 11月  4 10:42 test_chk
lrwxrwxrwx.  1 root root     9 11月  4 10:42 test_chk_ln -> test_chk/
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# cd test_chk
[root@server6 test_chk]# ll
总用量 0
[root@server6 test_chk]# ll
总用量 0
  • 正确删除软连接
[root@server6 ~]# rm -rf ./test_chk_ln
[root@server6 ~]# ll
总用量 84
-rw-------.  1 root root  1257 6月  16 01:17 anaconda-ks.cfg
drwxr-xr-x. 25 root root  4096 11月  1 10:28 azkabanJob
-rw-r--r--.  1 root root 67322 11月  4 10:24 azkabanJob.zip
drwxr-xr-x.  4 root root    37 7月  13 11:01 hadoop_temp
-rw-r--r--.  1 root root    54 7月   4 14:11 HelloLinux.txt
drwxr-xr-x.  2 root root    22 11月  4 10:44 test_chk
-rw-r--r--.  1 root root    67 10月  8 15:52 zookeeper.out
[root@server6 ~]# cd test_chk/
[root@server6 test_chk]# ll
总用量 4
-rw-r--r--. 1 root root 12 11月  4 10:44 test.txt

软连接实际上是通过名字来引用另外一个文件,类似于Windows的快捷方式。软连接和目标文件有着不同的inode号,也就是说软链接本身是一个独立的文件。可以理解为,软链接是一个独立文件,但是这个文件存储的是目标文件的路径,起到指针的作用。

ln -s abc.txt abc_s
ls -li

当系统访问软链接后,会自动跳转到对应的目标文件处进行处理。当你使用vim abc_s对该文件进行更改时,实质上更改的是abc.txt,当再次打开abc.txt后,发现其内容就是你刚改的东西。

硬链接

硬连接指通过索引节点来进行连接,在 Linux 中,多个文件名指向同一索引节点是存在的。

硬链接和软链接大不相同。硬链接是通过inode引用另外一个文件,因此硬链接和目标文件具有相同的inode号。也就是说,软链接是一个独立文件,但是硬链接和目标文件本质上就是同一个,可以理解为一个实际文件有多个文件名。

比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬链接与文件原有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不同文件系统上的文件,但是软链接就可以跨文件系统。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。

其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

每当我们为文件创建一个硬链接,该文件的硬链接数就是增加,上图中的2就是硬链接数。可以看到,因为abc_h和abc.txt本质上是一个文件,所以它们的硬链接数都为2。硬链接数也就表示的就是指有多少个文件的名字/路径和该文件的inode产生映射关系。info ln中这么解释硬链接:

A “hard link” is another name for an existing file; the link and the
original are indistinguishable. Technically speaking, they share the
same inode, and the inode contains all the information about a
file–indeed, it is not incorrect to say that the inode is the file.

Linux是不允许用户将硬链接指向的目录的。但是,Linux一切皆文件,包括目录,因此目录理应也可以硬链接。实际上,目录是有硬链接的,只不过这个操作只能由系统完成,用户是不能进行的。

硬链接存在以下几点特性:

  1. 文件有相同的 inode 及 data block;

  2. 只能对已存在的文件进行创建;

  3. 不能交叉文件系统进行硬链接的创建;

  4. 不能对目录进行创建,只可对文件创建;

  5. 删除一个硬链接文件并不影响其他有相同 inode 号的文件。

目录的硬链接

硬链接不能对目录创建是受限于文件系统的设计。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(…)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接(注意目录 /mnt/lost+found/ 的 inode 号)。若系统允许对目录创建硬链接,则会产生目录环。

可以看到,新创建的目录默认有两个硬链接数,说明有两条路径指向这个目录文件的inode。很显然,/home/sakura/test/testDir也即这个目录本身是一个,那么另一个是什么呢?

我们知道,每个目录都可以通过.来表明当前目录,也就是指向它自己。进入testDir内部,使用ln -ali来查看更详细的信息,发现.的inode号和testDir的inode号一模一样。也就是说,目录文件初始的两个硬链接,一个是其本身,另一个就是其下的。

现在,我们在testDir下再新建一个目录,重新查看其硬链接数,发现变为了3。

这是因为,新的目录下的..指向该目录的上级目录,就是testDir,它也是testDir的inode的一条路径,所以硬链接数变为了3。更一般的,一个新建的目录初始硬链接数为2,每当在该目录下新建一个子目录,其硬链接数就会加一,关系可以归为下图:

二、find命令

find命令是我们日常工作中比较常用的Linux命令。全面的掌握这个命令可以使很多操作达到事半功倍的效果。

find命令大家都比较熟悉,反倒想讲的有特色比较困难。那干脆我们怎么平淡怎么来好了。我们一般用的find命令格式很简单,一般分成三个部分:

find /etc -name "passwd"

格式如上,第一段find命令。第二段,要搜索的路径。这一段目录可以写多个,如:

find /etc /var /usr -name "passwd"

第三段,表达式。我们例子中用的是-name “passwd”这个表达式,指定条件为找到文件名是passwd的文件。对于find命令,最需要学习的是表达式这一段。表达式决定了我们要找的文件是什么属性的文件,还可以指定一些“动作”,比如将匹配某种条件的文件删除。所以,find命令的核心就是表达式(EXPRESSION)的指定方法。

find命令中的表达式有四种类型,分别是:

1、Tests:就是我们最常用的指定查找文件的条件。

2、Actions:对找到的文件可以做的操作。

3、Global options:全局属性用来限制一些查找的条件,比如常见的目录层次深度的限制。

4、Positional options:位置属性用来指定一些查找的位置条件。

这其中最重要的就是Tests和Actions,他们是find命令的核心。另外还有可以将多个表达式连接起来的操作符,他们可以表达多个表达式之间的逻辑关系和运算优先顺序,叫做Operators。

下面我们就来分类看一下这些个分类的功能:

find命令是通过文件属性查找文件的。所以,find表达式的tests都是文件的属性条件,比如文件的各种时间,文件权限等。很多参数中会出现指定一个数字n,一般会出现三种写法:

+n:表示大于n。

-n:表示小于n。

n:表示等于n。

1、根据时间查找

比较常用数字方式来指定的参数是针对时间的查找,比如-mtime n:查找文件修改时间,单位是天,就是n*24小时。举个例子说:

[root@zorrozou-pc0 zorro]# find / -mtime 7 -ls

我们为了方便看到结果,在这个命令中使用了-ls参数,具体细节后面会详细解释。再此我们只需要知道这个参数可以将符合条件的文件的相关属性显示出来即可。那么我们就可以通过这个命令看到查找到的文件的修改时间了。

[root@zorrozou-pc0 zorro]# find / -mtime 7 -ls|head
   524295      4 drwxr-xr-x  12  root     root         4096 6月  8 13:43 /root/.config
   524423      4 drwxr-xr-x   2  root     root         4096 6月  8 13:43 /root/.config/yelp
   524299      4 drwxr-xr-x   2  root     root         4096 6月  8 13:23 /root/.config/dconf
   524427      4 -rw-r--r--   1  root     root         3040 6月  8 13:23 /root/.config/dconf/user
...

我们会发现,时间都集中在6月8号,而今天是:

[root@zorrozou-pc0 zorro]# date
2016年 06月 15日 星期三 14:30:09 CST

实际上,当我们在mtime后面指定的是7的时候,实际上是找到了距离现在7个24小时之前修改过的文件。如果我们在考究一下细节的话,可以使用这个命令再将找到的文件用时间排下顺序:

[root@zorrozou-pc0 zorro]# find / -mtime 7 -exec ls -tld {} \+

此命令用到了exec参数,后面会详细说明。我们会发现,找到的文件实际上是集中在6月7日的14:30到6月8日的14:30这个范围内的。就是说,实际上,指定7天的意思是说,找到文件修改时间范围属于距离当前时间7个24小时到8个24小时之间的文件,这是不加任何+-符号的7的含义。如果是-mtime -7呢?

[root@zorrozou-pc0 zorro]# find / -mtime -7 -exec ls -tld {} \+

你会发现找到的文件是从现在开始到7个24小时范围内的文件。但是不包括7个24小时到8个24小时的时间范围。那么-mtime +7也应该好理解了。这就是find指定时间的含义。类似的参数还有:

-ctime:以天为单位通过change time查找文件。

-atime:以天为单位通过access time查找文件。

-mmin:以分钟为单位通过modify time查找文件。

-amin:以分钟为单位通过access time查找文件。

-cmin:以分钟单位通过change time查找文件。

这些参数都是指定一个时间数字n,数字的意义跟mtime完全一样,只是时间的单位和查找的时间不一样。

除了指定时间以外,find还可以通过对比某一个文件的相关时间找到符合条件的文件,比如-anewer file。

[root@zorrozou-pc0 zorro]# find /etc -anewer /etc/passwd

这样可以在/etc/目录下找到文件的access time比/etc/passwd的access time更新的所有文件。类似的参数还有:

-cnewer:比较文件的change time。

-newer:比较文件的modify time。

-newer还有一种特殊用法,可以用来做各种时间之间的比较。比如,我想找到文件修改时间比/etc/passwd文件的change time更新的文件:

[root@zorrozou-pc0 zorro]# find /etc/ -newermc /etc/passwd

这个用法的原型是:find /etc/ -newerXY file。其中Y表示的是跟后面file的什么时间比较,而X表示使用查找文件什么时间进行比较。-newermc就是拿文件的modify time时间跟file的change time进行比较。X和Y可以使用的字母为:

a:文件access time。
c:文件change time。
m:文件modify time。

在某些支持记录文件的创建时间的文件系统上,可以使用B来表示文件创建时间。ext系列文件系统并不支持记录这个时间。

2、根据用户查找

-uid n:文件的所属用户uid为n。
-user name:文件的所属用户为name。
-gid n:文件的所属组gid为n。
-group name:所属组为name的文件。
-nogroup:没有所属组的文件。
-nouser:没有所属用户的文件。

3. 根据权限查找

-executable:文件可执行。
-readable:文件可读。
-writable:文件可写。

-perm mode:查找权限为mode的文件,mode的写法可以是数字,也可以是ugo=rwx的方式如:

[root@zorrozou-pc0 zorro]# find /etc/ -perm 644 -ls

这个写法跟:

[root@zorrozou-pc0 zorro]# find /etc/ -perm u=rw,g=r,o=r -ls

是等效的。

搜索所有具有 777 权限的文件:

find . -type f -perm 777

另外要注意,mode指定的是完全符合这个权限的文件,如:

[root@zorrozou-pc0 zorro]# find /etc/ -perm u=rw,g=r -ls
   263562      4 -rw-r-----   1  root     brlapi         33 11月 13  2015 /etc/brlapi.key

没描述的权限就相当于指定了没有这个权限。

mode还可以使用/或-作为前缀进行描述。如果指定了-mode,就表示没指定的权限是忽略的,就是说,权限中只要包涵相关权限即可。如:

[root@zorrozou-pc0 zorro]# find /etc/ -perm 600 -ls

这是找到所有只有rw———-权限的文件,而-600就表示只要是包括了rw的其他位任意的文件。mode加/前缀表示的是,指定的权限只要某一位复合条件就可以,其他位跟-一样忽略,就是说-perm /600还可以找到r————或者-w———-这样权限的文件。老版本的/前缀是用+表示的,新版本的find意境不支持mode前加+前缀了。

我们可以使用 -user 选项指定用户名。例如,以下命令将查找所有属于 yang 的文件:

find -type f -user yang

4、根据路径查找

-name pattern:文件名为pattern指定字符串的文件。注意如果pattern中包括*等特殊符号的时候,需要加””。
-iname:name的忽略大小写版本。
-lname pattern:查找符号连接文件名为pattern的文件。
-ilname:lname的忽略大小写版本。

-path pattern:根据完整路径查找文件名为pattern的文件,如:

[root@zorrozou-pc0 zorro]# find /etc -path "/e*d"| head
/etc/machine-id
/etc/profile.d
/etc/vnc/xstartup.old
/etc/vnc/config.d
/etc/vnc/updateid
/etc/.updated

-ipath:path的忽略大小写版本。

-regex pattern:用正则表达式匹配文件名。

-iregex:regex的忽略大小写版本。

5、其他状态查找

-empty:文件为空而且是一个普通文件或者目录。

-size n[cwbkMG]:指定文件长度查找文件。单位选择位:

c:字节单位。

b:块为单位,块大小为512字节,这个是默认单位。

w:以words为单位,words表示两个字节。

k:以1024字节为单位。

M:以1048576字节为单位。

G:以1073741824字节温单位。

n的数字指定也可以使用+-号作为前缀。意义跟时间类似,表示找到小于(-)指定长度的文件或者大于(+)指定长度的文件。

类似于按时间戳查找文件,+ 表示“大于”,- 表示“小于”。例如,要查找大小为 10 MB ~ 1 GB 的文件:

find . -type f -size +10M -size -1G

-inum:根据文件的inode编号查找。

-links n:根据文件连接数查找。

-samefile name:找到跟name指定的文件完全一样的文件,就是说两个文件是硬连接关系。

-type c:以文件类型查找文件:

c可以选择的类型为:

b:块设备

c:字符设备

d:目录

p:命名管道

f:普通文件

l:符号连接

s:socket

例如目录:

find . -type d -name "yang*"

或者符号链接:

find . -type l -name "yang*"

ACTIONS

表达式中的actions类型参数主要是用来对找到的文件进行操作的参数。在上面的例子中,我们已经看到可以使用-ls参数对找到的文件进行长格式显示,这就是一个actions类型的参数。类似的参数还有。

-fls file:跟-ls功能一样,区别是将信息写入file指定的文件,而不是显示在屏幕上。

-print:将找到的文件显示在屏幕上,实际上默认find命令就会将文件打印出来显示。

-print0:-print参数会将每个文件用换行分割,而这个参数适用null分割。有时候在脚本编程时可能会用上。

-fprint file:-print参数的写入文件版本。将内容写到文件中,而不是显示在屏幕上。

-fprint0 file:-print0的写入文件版本。

-delete:可以将找到的文件直接删除。

-printf:格式化输出方式打印。如:

[root@zorrozou-pc0 zorro]# find /etc/ -name "pass*" -printf "%p "
/etc/default/passwd /etc/pam.d/passwd /etc/passwd- /etc/passwd

显示文件名,并以空格分隔。%p代表文件名。其他信息可以参见man find。

-prune:如果复合条件的是一个目录,则不进入目录进行查找。例子:

[root@zorrozou-pc0 zorro]# mkdir /etc/passs
[root@zorrozou-pc0 zorro]# touch /etc/passs/passwd
[root@zorrozou-pc0 zorro]# find /etc/ -name "pass*" -prune
/etc/passs
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd
[root@zorrozou-pc0 zorro]# find /etc/ -name "pass*"
/etc/passs
/etc/passs/passwd
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd

我们先创建了一个/etc/passs的目录,然后在这个目录下创建了一个叫passwd的文件。之后先用带-prune的find看到,能显示出passs目录,但是目录中的passwd文件并没有显示,说明这个参数让find命令没有进入这个目录查找。而后一个不带-prune参数的find显示出了passs目录下的passwd。

-quit:找到符合条件的文件后立即退出。

6. find中执行命令

-exec

find命令的exec是一个非常好用的参数,当然其可能造成的破坏也可能非常大。在学习它之前,我先要提醒大家,使用之前千万要确定自己在做什么。

这个参数的常见格式是:

-exec command ;

注意后面的分号。它是用来给find做标记用的。find在解析命令的时候,要区分给定的参数是要传给自己的还是要传给command命令的。所以find以分号作为要执行命令所有参数的结束标记。命令返回值为0则返回true。在exec参数指定的执行命令中,可以使用{}符号表示当前find查找结果的占位符。比如:

[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \;
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd

上面的命令表示,找到/etc/目录下文件名为passwd的文件,并echo其文件名。注意再使用分号的时候前面要加转移字符\,因为分号也是bash的特殊字符,所以bash会先解释它。前面加上\就可以让bash直接将其船体给find命令,这个分号由find解释,而不是bash。其实这个exec用的比较废话,毕竟find本身就会找到相关条件的文件并显示其文件名。但是试想如果我们将echo换成rm或者cp,是不是就有意义的多?比如:

[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec rm {} \;

请不要执行这个命令!!

或者:

[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec cp {} {}.bak \;

这个命令可以将符合条件的文件都加个.bak后缀备份一份。于是我们可以执行删除了:

[root@zorrozou-pc0 find]# find /etc/ -name "passwd.bak"
/etc/default/passwd.bak
/etc/pam.d/passwd.bak
/etc/passwd.bak
[root@zorrozou-pc0 find]# find /etc/ -name "passwd.bak" -exec rm {} \;
[root@zorrozou-pc0 find]# find /etc/ -name "passwd.bak"

当然,删除前还是要确认清楚你要删的文件一定是对的。

做一个尝试,请在终端上执行以下两个命令,并检查它们的结果有何不同:

一个使用占位符:

find . -type f -atime +5 -exec ls {} \;

另一个不使用:

find . -type f -atime +5 -exec ls \;

-exec 选项后面的命令必须以分号(;)结束。众所周知,转义字符用于去除单个字符的特殊含义。在 Linux 中,反斜杠 \ 用作转义字符。所以我们将它用于分号字符。

-execdir

execdir和exec有一些差别,主要是在执行指定的命令时,那个相关命令是在那个工作目录下执行的差别。exec是在find所指定的起始目录,而execdir是文件所在目录。对比一下就明白了:

[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \;
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -execdir echo {} \;
./passwd
./passwd
./passwd

一个命令打印出来的路径都是/etc/开头,另一个显示的都是当前目录下的某某文件。

execdir的方式要比exec安全一些,因为这种执行方式避免了在解析文件名时所产生的竞争条件。

出了上述两种比较典型的执行命令的方法以外,find还对这两个参数提供了另一种形式的命令执行格式:

-exec command {} +
-execdir command {} +

我们还是先用例子来看一下这个格式和以分号结束的方式的差别:

[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \;
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
[root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \+
/etc/default/passwd /etc/pam.d/passwd /etc/passwd

光这样看可能还不是很明显,我们可以这样在描述一遍他们的执行过程:

echo /etc/default/passwd
echo /etc/pam.d/passwd
echo /etc/passwd

echo /etc/default/passwd /etc/pam.d/passwd /etc/passwd

其实就是说,对于command {} ;格式来说,每找到一个文件就执行一遍相关命令,而command {} +格式的意思是说,先执行find,找到所有符合条件的文件之后,将每个文件作为命令的一个参数传给命令执行,exec指定的命令实际上只被执行了一次。这样用的限制也是不言而喻的:{}只能出现一次。

[root@zorrozou-pc0 find]# find /etc -mtime -7 -type f -exec cp -t /tmp/back/ {} \+

上面这个命令将符合条件的文件全部cp到了/tmp/back目录中,当然如果文件有重名的情况下,会被覆盖掉。从这个命令中我们学习一下{} +格式的使用注意事项,它不能写成:

find /etc -mtime -7 -type f -exec cp {} /tmp/back/ \+

所以只能使用-t参数改变cp命令的参数顺序来指定相关的动作。

无论如何,直接使用exec和execdir是很危险的,因为他们会直接对找到的文件调用相关命令,并且没有任何确认。所以我们不得不在进行相关操作前再三确认,以防止误操作。当然,find命令也给了更安全的exec参数,它们就是:

-ok

-okdir

它们的作用跟exec和execdir一样,区别只是在做任何操作之前,会让用户确认是不是ok?如:

[root@zorrozou-pc0 find]# find /etc -mtime -7 -type f -ok cp -t /tmp/back/ {} \;
< cp ... /etc/bluetooth/main.conf > ?

于是,每一次cp你都要确认是不是要这么做。只要你输入的是y或者以y开头的任何字符串,都是确认。其他的字符串是否认。另外,这两个参数不支持{} +的格式。

7、OPERATORS

find的操作符(OPERATORS)实际上是用来连接多个表达式和确定其逻辑关系用的。如:

[root@zorrozou-pc0 zorro]# find /etc -name "pass*" -type f
/etc/passs/passwd
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd

这个find命令中使用了两个表达式,他们之间没有任何分隔,这是实际上表达的含义是,找到两个条件都符合的文件。实际上就是表达式的逻辑与关系,这跟-a参数连接或者-and参数一样:

[root@zorrozou-pc0 zorro]# find /etc -name "pass*" -a -type f
/etc/passs/passwd
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd
[root@zorrozou-pc0 zorro]# find /etc -name "pass*" -and -type f
/etc/passs/passwd
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd

除了逻辑与关系以外,还有逻辑或关系:

[root@zorrozou-pc0 zorro]# find /etc -name "pass*" -o -type f
[root@zorrozou-pc0 zorro]# find /etc -name "pass*" -or -type f

表示两个条件只要符合其中一个都可以。

在条件表达式前面加!表示对表达式取非。同样的也可以用-not参数。另外如果表达式很多,可以使用( expr )确定优先级,如:

[root@zorrozou-pc0 zorro]# find / \( -name "passwd" -a -type f \) -o \( -name "shadow" -a -type f \)

这里表示的是:-name “passwd” -a -type f和-name “shadow” -a -type f是或关系。

find中还可能常用的其他参数比如:

-depth:制定了这个参数后,遇到目录先进入目录操作目录中的文件,最后再操作目录本身。

-maxdepth:目录最大深度限制。

-mindepth:目录最小深度限制。

8、 按名称或正则表达式查找文件

让我们从最简单的用法开始。要按特定名称搜索文件,命令如下:

find . -name test.txt

如何查找所有格式为 pdf 的书籍?使用正则表达式:

find ./yang/books -name "*.pdf"

默认情况下,find 命令会搜索常规文件,但最好进行指定(-type f)以使所有内容更清晰:

find ./yang/books -type f -name "*.pdf"

三、Linux压缩和解压缩命令

Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法。

tar命令

参数:

-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件 

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出  

下面的参数-f是必须的

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名:

tar -cf all.tar *.jpg 

将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思:

 tar -rf all.tar *.gif 

tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:

# tar -cf all.tar *.jpg

这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包 ,-f指定包的文件名。

# tar -rf all.tar *.gif

这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。

# tar -uf all.tar logo.gif

这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

# tar -tf all.tar

这条命令是列出all.tar包中所有文件,-t是列出文件的意思

# tar -xf all.tar

这条命令是解出all.tar包中所有文件,-x是解开的意思。

以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。

1) tar调用

gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip 相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:

# tar -czf all.tar.gz *.jpg

这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz

# tar -xzf all.tar.gz

这条命令是将上面产生的包解开。

2) tar调用bzip2

bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。

与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:

# tar -cjf all.tar.bz2 *.jpg

这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2

# tar -xjf all.tar.bz2

这条命令是将上面产生的包解开。

3) tar调用compress

compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与 compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用compress。下面来举例说明一下:

# tar -cZf all.tar.Z *.jpg

这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z。

# tar -xZf all.tar.Z

这条命令是将上面产生的包解开。

有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:

1、对于.tar结尾的文件

tar -xf all.tar

2、对于.gz结尾的文件

gzip -d all.gz
gunzip all.gz

3、对于.tgz或.tar.gz结尾的文件

tar -xzf all.tar.gz
tar -xzf all.tgz

4、对于.bz2结尾的文件

bzip2 -d all.bz2
bunzip2 all.bz2

5、对于tar.bz2结尾的文件

tar -xjf all.tar.bz2

6、对于.Z结尾的文件

uncompress all.Z

7、对于.tar.Z结尾的文件

tar -xZf all.tar.z

zip命令

linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

将所有.jpg的文件压缩成一个zip包:

zip all.zip *.jpg

将all.zip中的所有文件解压出来:

unzip all.zip

rar命令

要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux 不是免费的;可从下载RAR for Linux :

WinRAR archiver, a powerful tool to process RAR and ZIP files
然后安装:

tar -xzpvf rarlinux-3.2.0.tar.gz
cd rar
make

这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar 是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法: 

rar a all *.jpg

这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。

unrar e all.rar

这条命令是将all.rar中的所有文件解压出来。

gzip命令

gzip只能压缩文件,不能压缩目录。对于gzip压缩后,不会保留原文件。

语 法:

gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][文件...] 
Or
gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][目录] 

补充说明:gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出".gz"的扩展名。

参 数:

-a或--ascii 使用ASCII文字模式。
-c或--stdout或--to-stdout 把压缩后的文件输出到标准输出设备,不去更动原始文件。
-d或--decompress或----uncompress 解开压缩文件。
-f或--force 强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接。
-h或--help 在线帮助。
-l或--list 列出压缩文件的相关信息。
-L或--license 显示版本与版权信息。
-n或--no-name 压缩文件时,不保存原来的文件名称及时间戳记。
-N或--name 压缩文件时,保存原来的文件名称及时间戳记。
-q或--quiet 不显示警告信息。
-r或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-S<压缩字尾字符串>或----suffix<压缩字尾字符串> 更改压缩字尾字符串。
-t或--test 测试压缩文件是否正确无误。
-v或--verbose 显示指令执行过程。
-V或--version 显示版本信息。
-<压缩效率> 压缩效率是一个介于1-9的数值,预设值为"6",指定愈大的数值,压缩效率就会愈高。
--best 此参数的效果和指定"-9"参数相同。
--fast 此参数的效果和指定"-1"参数相同。
gunzip boduo.gz
Or 
gzip -d boduo.gz

把生成boduo.gz文件进行解压。

bzip2命令

对于bzip2只能压缩文件,不能压缩目录,加上参数-k才会保留原文件。

压缩boduo文件,生成boduo.bz2文件;和gzip效果一样的:

bzip2 boduo

 压缩longze文件,生成longze.bz2文件,并保留了原文件。是gzip的升级:

bzip2 -k  longze

 解压生成longze.bz2文件,并保留了原压缩文件:

bunzip2 -k  longze.bz2

总结:

压缩:

tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for linux
zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux

解压:

tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar –xZvf file.tar.Z //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip

*.tar 用 tar –xvf 解压;

*.gz 用 gzip -d或者gunzip 解压;

*.tar.gz和*.tgz 用 tar –xzf 解压;

*.bz2 用 bzip2 -d或者用bunzip2 解压;

*.tar.bz2用tar –xjf 解压;

*.Z 用 uncompress 解压;

*.tar.Z 用tar –xZf 解压;

*.rar 用 unrar e解压;

*.zip 用 unzip 解压;

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/126205347