假日的英文译语怎么说-北京日语学校
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/{};
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在线翻译读音例句
发布评论