コマンドとコマンドxargsのを見つけるためのexecオプション

自分の「初心者のためのLinuxシステム管理ガイド - CentOSの7.6に基づいては、」この本の感触の全体的な質のために、2019年10月に出版された非常に満足ですが、知識のレベルに限定されていた、まだいくつかの場所で説明されていません明らかに、その講義の過程で絶えず変更されています。私は改訂第二版を期待して、元の本のこの部分を書き換える必要があったので、例えば、最近では、多くの学生が疑問視、検索のexecコマンドオプションの話を聞きました。
コマンドとコマンドxargsのを見つけるためのexecオプション

処理のためのファイルとして結果を見つけるために「-exec」オプション

このコマンドを使用することができ、さらに追いつくために、後に実行される処理コマンドの「-exec」オプション、「{}」の結果にfindコマンドを示し、最終的にあなたが追加する必要があります「\;」前にスペースがあることに注意してください(コマンドの終わりを示します)。
例えば、ファイル「.TXT」サフィックスすべての/ tmpディレクトリを見つけると、それを削除します。
[root@localhost ~]# find /tmp -name "*.txt" -exec rm -f {} \;
「|」(セクション2.9.5で説明)それがない以上を達成することはできません。このパイプ記号は、なぜ多くの学生が、ここで不思議に思われるでしょうか?たとえば、我々は次のテストを実行します。

[root@localhost ~]# touch /tmp/{a,b,c}.txt  #在/tmp目录中生成3个测试文件
[root@localhost ~]# find /tmp -name "*.txt" | rm -f     #利用管道结合rm删除
[root@localhost ~]# find /tmp -name "*.txt"     #测试文件仍然存在
/tmp/a.txt
/tmp/b.txt
/tmp/c.txt
[root@localhost ~]# find /tmp -name "*.txt" -exec rm -f {} \;   #利用exec结合rm删除
[root@localhost ~]# find /tmp -name "*.txt" #测试文件被成功删除

最も重要な役割のexecオプションの結果は、あなたがに対処するように、ファイルの中のコマンドを見つけることができるということですが、デフォルトでは、findコマンドの結果は、テキスト情報の処理として扱われることが判明しました。
どのように上の段落それを理解するには?たとえば、「見つけるに/ tmp -name」* .txtという実装のために 「」 コマンドの3個の文書が見つかりました:/tmp/a.txt,/tmp/b.txt,/tmp/c.txt、デフォルトの場合は、単にコマンドを見つけます私たちは、画面上で見ることができるので、検索して画面上に出力の名前でそれらを置くために、検索基準を満たす3つのファイルがテキスト情報の3行のみです。運転指令の導入は、このようなgrepのコマンドでフィルタリングWCコマンド数行、と同様に、処理される前に、テキスト・メッセージの場合は、ファイルの内容を使用することができます。

[root@localhost ~]# find /tmp -name "*.txt" | wc -l     #统计find找到的文件数量
3
[root@localhost ~]# find /tmp -name "*.txt" | grep 'a'  #对find的结果进行过滤
/tmp/a.txt

テキストメッセージの場合は、ファイルやディレクトリの操作は、先に紹介し、コマンドこれらのオブジェクトは、コマンドファイルによって運営されなければならないので、などのcp、mvは、RM、として、扱うことができません。その主な役割は、findコマンドの結果を見つけることですので、この時点でのexecオプションは、便利になることができなくなったテキストメッセージとしてではなく、ファイルとして見られません。ファイル操作コマンドによるさらなる処理の結果を見つける必要があるのであれば、あなたは、execオプションを組み合わせる必要があります。
例えば、検索/ファイルbootディレクトリの先頭に「INIT」、とは、/ tmpディレクトリにコピーします。
[root@localhost ~]# find /boot -name "init*" -exec cp {} /tmp \;
たとえば、/ etcディレクトリが1MB以上のファイルのサイズを見つけるために、その詳細が表示され、ヒト化。

[root@localhost ~]# find /etc -size +1M -exec ls -lh {} \;
……
-r--r--r--. 1 root root 7.6M 9月   5 18:53 /etc/udev/hwdb.bin
-rw-r--r--. 1 root root 1.4M 4月  11 09:32 /etc/brltty/zh-tw.ctb

xargsのコマンド

さらに処理するために見出された結果は、findコマンドで-execオプションを使用する場合は、時々問題が発生する可能性があります。これは-execが処理すべきコマンドの後ろに一度に検索の結果として発見されたためで、時々見つけるコマンドの後ろにパラメータを処理することができますを超えて、多数の文書を見つけることができ、そこだろうオーバーフローエラーは、エラーメッセージは、あなたがxargsのコマンドを使用することができ、通常は「あまりにも長い引数リスト」または「パラメータ欄オーバーフロー」です。Linuxでは、それ自体が独立したコマンドですが、通常はfindコマンドで使用されているがxargsの。xargsのことで、あなたは結果が回避オーバーフローの問題のために、処理するためにバッチで送信されたコマンドの後に分割されます見つける見つけることができます。
xargsのは、findコマンドと一緒に使用するパイプラインのニーズを通じてコマンド、xargsが「| xargsのコマンドを見つける......」形式を命じます。
私たちは、最初のテストファイルを作成してみましょう。

[root@localhost ~]# mkdir /tmp/pass
[root@localhost ~]# echo "password:123" >> /tmp/pass/test.txt

/のtmpディレクトリに保存され、これらのファイルのいずれかで、多数のファイルをパスワードに格納され、キーワードは「パスワード」であると仮定し、我々は今見つけるために、このパスワードファイルを保存することができるように願っています。
あなたはコマンドを見つけるために、-execオプションを使用する場合は、次のコマンドを実行することができます。

[root@localhost ~]# find /tmp -type f -exec grep "password" {} \;
password:123

これは、上記のコマンドでパスワードを見つけるためにかかわらず、見つけることができますが、保存されたパスワードファイル名は表示されません。xargsのを行うには、次の変更は、この要件を達成するためのコマンド、xargsがキーワードが一緒に表示されたファイルを含むことができます。

[root@localhost ~]# find /tmp -type f | xargs grep "password"
/tmp/pass/test.txt:password:123

別の例として、我々はサフィックスファイルなどを/ tmpディレクトリと/ tmpのすべての下位のサブディレクトリ、ファイル名「.TXT」は/ rootディレクトリにコピーされたいです。:オプションは-exec findコマンドを達成する場合は
[root@localhost ~]# find /tmp -name "*.txt" -exec cp {} /root \;
実装されている場合、同じ必要性、及び必要に-iオプションxargsのコマンドを追加するには、コマンドxargsのにfindコマンドの結果を表すために「{}」の手段を。
[root@localhost ~]# find /tmp -name "*.txt" | xargs -i cp {} /root
これらのいくつかの例を通して見ることができ、xargsのは、コマンドと見つける-execコマンドオプションは、基本的に-execオプションが要件を満たすためならばそう、あなたはxargsのコマンドを使用する必要はありません同じです。主な目的xargsのコマンドは、それは結果がオーバーフローエラーを回避するために、バッチコマンドを見つけるために見つけることができるということです。
たとえば、/ etcディレクトリにある、2507年通常のファイルの合計。

[root@localhost ~]# find /etc -type f | wc -l
2507

我々は、すなわちこれらの2つの方法を達成するために、キーワード「のPermitRootLogin」を含むすべてのファイルの/ etcディレクトリを知りたい場合は:

[root@localhost ~]# find /etc -type f -exec grep "PermitRootLogin" {} \;
#PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
[root@localhost ~]# find /etc -type f | xargs grep "PermitRootLogin" 
/etc/ssh/sshd_config:#PermitRootLogin yes
/etc/ssh/sshd_config:# the setting of "PermitRootLogin without-password".

方法-execオプションの実現に見つけることができ、その後、データの量が多数あれば、それはオーバーフローを引き起こすかもしれない、明確なカトンあります。使用xargsがだけでなく、より詳細に表示されているものを、一方ではないでしょうオーバーフローの問題に、より迅速に一方では、達成するためのコマンド。だから、このタイプの動作中に、より多くの利用xargsのコマンドにお勧めします。

おすすめ

転載: blog.51cto.com/yttitan/2455746