假日的英文译语怎么说-北京日语学校


2023年4月7日发(作者:苏格兰脱离英国)

Linux中find命令的使⽤详解(下)

通过前两篇⽂章,如果我们都掌握了的话,在平常的系统运维、管理中基本可以达到得⼼应⼿的程度了。接下来,我们通过这篇⽂章,我们

将更加深⼊了解关于find命令的⾼级应⽤。接下来我们将分为三个部分分别进⾏介绍。

四、ACTIONS

这⼀部分的内容⾮常多,我就选取常⽤的部分进⾏学习、分享。ACTIONS也是表达式中的⼀部分,表达式中的actions类型参数主要是⽤来

对找到的⽂件进⾏操作的参数。在上⾯的例⼦中,我们已经看到可以使⽤-ls参数对找到的⽂件进⾏长格式显⽰,这就是⼀个actio兰亭序全文真迹 原帖 ns类型的

参数。

-flsfile:跟-ls功能⼀样,区别是将信息写⼊file指定的⽂件,⽽不是显⽰在屏幕上。

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

-print0:-print参数会将每个⽂件⽤换⾏分割,⽽这个参数适⽤null分割。有时候在脚本编程时可能会⽤上。

-fprintfile:-print参数的写⼊⽂件版本。将内容写到⽂件中,⽽不是显⽰在屏幕上。

-fprint0file:-print0的写⼊⽂件版本。

上⾯的命令也相当于:

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

-printf:格式化输出⽅式打印,这个就很类似于C语⾔的printf函数了,在这⾥可以参考C语⾔的这个函数,通过manfind,我发现,基本就

是C语⾔中printf函数的兄弟。不过写法有点与C语⾔中不⼀样,这⼀点学要我们特别注意⼀下。

-prune:如果复合条件的是⼀个⽬录,则不进⼊⽬录进⾏查找。

[root@GeekDevOps-find~]#find/-

[root@GeekDevOps-find~]#

/dev/centos/root

/proc/1/task/1/root

/proc/1/root

...

[root@GeekDevOps-find~]#find/-nameroot-print>

[root@GeekDevOps-find~]#ll

总⽤量8

-rw-------.1rootroot16051⽉718:

-rw-r--r--.1rootroot441⽉723:

-rw-r--r--.1rootroot01⽉2423:

-rw-r--r--.1rootroot01⽉723:

-rw-r--r--.1rootroot01⽉723:

[root@GeekDevOps-find~]#find/-

/root/

[root@GeekDevOps-find~]#find/--delete

[root@GeekDevOps-find~]#ls

[root@GeekDevOps-find~]#find/--printf\"%p\"

/root/[root@GeekDevOps-find~]#

以上例⼦中为了避免⽂件名shadow造成冲突,我在后⾯多加了⼀个w,注意区分。

-quit:找到符合条件的⽂件后⽴即退出,⼦进程同时也结束。

在find命令中,还可以直接执⾏⼀些命令,这个⽤得好的话也同样能起到事半功倍的效果。

-exec:find命令的exec是⼀个⾮常好⽤的参数,当然其可能造成的破坏也可能⾮常⼤。在使⽤之前千万要确定⾃⼰在做什么。

这个参数的常见格式是:-execcommand;

注意后⾯的分号。它是⽤来给find做标记⽤的。find在解析命令的时候,要区分给定的参数是要传给⾃⼰的还是要传给command命令的。

所以find以分号作为要执⾏命令所有参数的结束标记。命令返回值为0则返回true。在exec参数指定的执⾏命令中,可以使⽤{}符号表⽰当

前find找到的⽂件名。⽐如:

上⾯的命令表⽰,找到/etc/⽬录下⽂件名为passwd的⽂件,并echo其⽂件名。注意再使⽤分号的时候前⾯要加转义字符,因为分号也是

bash的特殊字符,所以bash会先解释它。前⾯加上就可以让bash直接将其传给find命令,这个分号由find解释,⽽不是bash。其实这个

exec⽤的⽐较废话,毕竟find本⾝就会找到相关条件的⽂件并显⽰其⽂件名。但是试想如果我们将echo换成rm或者cp,是不是就有意义的

多?⽐如:

效果是不是⾮常明显?请不要轻易执⾏这个命令!!

或者:

这个命令可以将符合条件的⽂件都加个.bak后缀备份⼀份。于是我们可以执⾏删除了,删除前还是要确认清楚你要删的⽂件⼀定是对的。

-execdir:execdir和exec有⼀些差别,主要是在执⾏指定的命令时,exec是在find所指定的起始⽬录执⾏,⽽execdir是包含匹配⽂件所

在的⼦⽬录,⽽不是⼀个正常⽬录。

[root@GeekDevOps-find~]#mkdir/etc/shadoww

[root@GeekDevOps-find~]#touch/etc/shadoww/shadoww

[root@GeekDevOps-find~]#mkdir-p/etc/GeekDevOps/shadoww

[root@GeekDevOps-find~]#find/-nameshadoww-prune

/etc/shadoww

/etc/GeekDevOps/shadoww

[root@GeekDevOps-find~]#find/-nameshadoww

/etc/shadoww

/etc/shadoww/shadoww

/etc/GeekDevOps/shadoww

[root@GeekDevOps见贤思齐焉下一句 -find~]#find/etc/-name\"passwd\"-exececho{};

/etc/passwd

/etc/pam.d/passwd

[root@GeekDevOps-find~]#ll

总⽤量8

-rw-------.1rootroot16051⽉718:

-rw-r--r--.1rootroot441⽉723:

-rw-r--r--天地不仁以万物为刍狗什么意思 .1rootroot01⽉723:

-rw-r--r--.1rootroot01⽉723:

[root@GeekDevOps-find~]#find/-name\"\"-execrm{};

[root@GeekDevOps-find~]#ll

总⽤量8

-rw-------.1rootroot16051⽉718:

-rw-r--r--.1rootroot441⽉723:

-rw-r--r--.1rootroot01⽉723:

[root@GeekDevOps-find~]#find/-name\"\"-execcp{}{}.bak;

[root@GeekDevOps-find~]#ll

总⽤量8

-rw-------.1rootroot16051⽉718:

-rw-r--r--.1rootroot441⽉723:

-rw-r--r--.1rootroot01⽉723:

-rw-r--r--.1rootroot01⽉2500:

前⼀个命令打印出来的路径都是以/开头,后⼀个显⽰的都是当前⽬录下的某某⽂件。execdir的⽅式要⽐exec安全⼀些,因为这种执⾏⽅

式避免了在解析⽂件名时所产⽣的竞争条件。

出了上述两种⽐较典型的执⾏命令的⽅法以外,find还对这两个参数提供了另⼀种形式的命令执⾏格式:

-execcommand{}+

-execdircommand{}+

我们还是先⽤例⼦来看⼀下这个格式和以分号结束的⽅式的差别:

其实就是说,对于command{};格式来说,每找到⼀个⽂件就执⾏⼀遍相关命令,⽽command{}+格式的意思是说,先执⾏find,找到

所有符合条件的⽂件之后,将每个⽂件作为命令的⼀个参数传给命令执⾏,exec指定的命令实际上只被执⾏了⼀次。这样⽤的限制也是不⾔

⽽喻的:{}只能出现⼀次。

上⾯这个命令将符合条件的⽂件全部cp到了/opt/⽬录中,当然如果⽂件有重名的情况下,会被覆盖掉。从这个命令中我们学习⼀下{}+格

式的使⽤注意事项,它不能写成:

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

我们不难看出,直接使⽤exec和execdir是很危险的,因为他们会直接对找到的⽂件调⽤相关命令,并且没有任何确认。所以我们不得不在

进⾏相关操作前再三确认,以防⽌误操作。当然,find命令也给了更安全的exec参数,它们就是:

-ok

-okdir

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

[root@GeekDevOps-find~]#find/-n相思的诗句大全 amepasswd-execls{};

indexperms

/sys/fs/selinux/class/passwd/perms/passwd

/etc/passwd

/etc/pam.d/passwd

/usr/bin/passwd

[root@GeekDevOps-find~]#find/-namepasswd-exe古代名言警句 cdirls{};

indexperms

./passwd

./passwd

./passwd

./passwd

[root@GeekDevOps-find~]#find/-namepasswd-execls{}+;

/etc/pam.d/passwd/etc/passwd/sys/fs/selinux/class/passwd/perms/passwd/usr/bin/passwd

/sys/fs/selinux/class/passwd:

indexperms

[root@GeekDevOps-find~]#find/-namepasswd-execdirls{}+;

indexperms

./passwd

./passwd

./passwd

./passwd

[root@GeekDevOps-find~]#find/--execcp-t/opt/{}+;

cp:不会以\"/home/GeekDevOps/\"覆盖刚创建的\"/opt/\"

[root@GeekDevOps-find~]#find/--execcp{}/opt/+;

find:遗漏“-exec”的参数

通过上⾯的例⼦,我们发现这个⽂件被复制了2次,并且最后⼀⾏还有提⽰,这是由于我们查找和复制都在同⼀个⽬录下

⾯,在find命令查找到这个⽂件时,进⾏复制,接着进⾏下⼀次查找,结果就查找到了之前复制过来的⽂件,这⼀点在平时的使⽤中我们需

要注意⼀下。每⼀次cp你都要确认是不是要这么做。只要你输⼊的是y或者以y开头的任何字符串,都是确认。其他的字符串是否认。另

外,这两个参数不⽀持{}+的格式。

五、操作符(OPERATORS)

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

这个find命令中使⽤了两个表达式,他们之间没有任何分隔,这是实际上表达的含义是,找到两个条件都符合的⽂件。实际上就是表达式的

逻辑与关系,这跟-a参数连接或者-and参数⼀样:

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

表⽰两个条件只要符合其中⼀个都可以。

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

[root@GeekDevOps-findopt]#pwd

/opt

[root@GeekDevOps-findopt]#ll

总⽤量0

[root@GeekDevOps-findopt]#find/--okcp-t/opt/{};

?y

?y

cp:\"/opt/\"与\"/opt/\"为同⼀⽂件

[root@GeekDevOps-findopt]#ll

总⽤量0

-rw-r--r--.1rootroot01⽉2511:

[root@GeekDevOps-findopt]#find/-name\"Geek*\"-typef

/root/

/root/

/root/

/root/

/root/

/root/

/var/spool/mail/GeekDevOps

/home/GeekDevOps/

/home/GeekDevOps/

/home/GeekDevOps/

/home/GeekDevOps/

/home/GeekDevOps/

/opt/

[root@GeekDevOps-findopt]#find/-name\"Geek*\"-a-typef

[root@GeekDevOps-findopt]#find/-name\"Geek*\"-o-typef

[root@GeekDevOps-findopt]#find/(-name\"passwd\"-a-typef)-o(-name\"shadow\"-a-typef)

/sys/fs/selinux/class/passwd/perms/passwd

/etc/passwd

/etc/shadow

/etc/pam.d/passwd

/usr/bin/passwd

这⾥表⽰的是:-name“passwd”-a-typef和-name“shadow”-a-typef是或关系。

find中还可能常⽤的其他参数⽐如:

-depth:制定了这个参数后,遇到⽬录先进⼊⽬录操作⽬录中的⽂件,最后再操作⽬录本⾝。

-maxdepth:⽬录最⼤深度限制。

-mindepth:⽬录最⼩深度限制。

⾄此,关于find命令的介绍基本完成了,这是⼀个⽐较常⽤的命令,还有更多的功能期待⼤关山月陆游原文拼音 家去发现,具体可以man⼀下find的⼿册。随时

随地阅读我的⽂章,敬请关注同名微赞美马的经典语句 信公众号及头条号。

更多推荐

geek是什么意思k在线翻译读音例句