xargsの一般的なシナリオは機能します

XargsにはさまざまなSao操作があります。この記事では、作業で一般的に使用されるより重要な操作の一部のみをリストします。1行のコマンドを実行する場合、xargsは簡潔に見えますが、必然的に読み取りが困難になります(特に慣れていない場合) xargsを使用)、スクリプトを作成している場合は、xargsを使用しないことをお勧めします。通常はループを使用します。メンテナンスがより便利です。

水平テキスト垂直表示

この種の操作により、一部のシナリオでテキストコンテンツをフィルタリングしやすくなります。

命令
==========
echo "1 2 3 4 5 6 7 8 9 10" | xargs -n 1 echo


输出演示
==========
[root@192_168_31_106 ~]# echo "1 2 3 4 5 6 7 8 9 10" | xargs -n 1 echo
1
2
3
4
5
6
7
8
9
10


相关解释
==========
echo "1 2 3" | xargs -n 1 echo 
# 上面这条命令等价于下面这样
echo 1
echo 2
echo 3
# 当然我们也可以利用循环实现此需求
for i in 1 2 3 4 5 6 7 8 9 10; do echo $i; done


扩展理解
==========
[root@192_168_31_106 ~]# echo "1 2 3 4 5 6 7 8 9 10" | xargs -n 2 echo
1 2
3 4
5 6
7 8
9 10
#可以看到,这里就相当于 "每次echo 2个"

[root@192_168_31_106 ~]# echo "1 2 3 4 5 6 7 8 9 10" | xargs -n 3 echo
1 2 3
4 5 6
7 8 9
10
#可以看到,这里就相当于 "每次echo 3个"

[root@192_168_31_106 ~]# echo "1 2 3 4 5 6 7 8 9 10" | xargs echo
1 2 3 4 5 6 7 8 9 10
#可以看到,这里就相当于 "每次echo 全部",跟直接echo输出的信息内容一致了

ここでのエコーは省略できます。デフォルトの後にxargsが続くのはechoコマンドです

垂直テキストは水平に表示されます

これは純粋にxargsの動作メカニズムを完全に理解するためのものです

命令
==========
seq 10 | xargs echo


输出演示
==========
[root@192_168_31_106 ~]# seq 5
1
2
3
4
5
[root@192_168_31_106 ~]# seq 5 | xargs echo
1 2 3 4 5
[root@192_168_31_106 ~]# seq 10 | xargs -n 5 echo
1 2 3 4 5
6 7 8 9 10

上記の前兆を踏まえて、作業で使用できるより実用的なシナリオをいくつか挙げてみましょう。指摘する必要があるのは、基本的にxargsで実現できるシナリオは、forループを作成することで実現できるということですが、作成は面倒です。 。ループ内の複数行に書き込む

ここでのエコーは省略できます。デフォルトの後にxargsが続くのはechoコマンドです

バッチキルプロセス

ps -ef | grep ping | grep -v grep | awk '{print $2}' | xargs -n 1 kill
#上面这条命令相当于 
kill pid1
kill pid2

ps -ef | grep ping | grep -v grep | awk '{print $2}' | xargs kill
#上面这条命令相当于
kill pid1 pid2

可以看到这两种写法等价,因为对于kill命令来说,这两种写法等价

検索で使用

1 将/data目录下的修改时间是7天以前,并且大于100k的文件复制到到/tmp目录下
===================
find /data/ -mtime +7 -type f -size +100k | xargs cp -t /tmp/
这条命令就有点意思了,首先我们直到find命令返回的是垂直排列的文件名列表,而使用cp拷贝文件,常用的方法是下面这样
cp file1 file2 file3 /tmp
可以看到,需要拷贝的文件在中间,而xargs需要的参数在末尾,因此我们利用cp命令的 -t 参数


2 查找出系统中大于50k且小于100k的文件,把文件中的的hello替换为为world
===================
find / -type f -size +50k -size -100k | xargs sed -i 's#hello#world#g'

-Iパラメータの一時的な置換

#前面提到过的下面这个用法,如果大家觉得理解不方便
find /data/ -mtime +7 -type f -size +100k | xargs cp -t /tmp/
#我们还可以这样写
find /data/ -mtime +7 -type f -size +100k | xargs -I mytmp cp mytmp /tmp/
#可以看到,这里我们用mytmp来代指前面xargs找到的内容,这里的mytmp可以任意起一个名称

ファイルを一括削除する

find /data/ -mtime +7 -type f -size +100k | xargs rm -rf
上面的情况不用xargs可以写喜循环实现,还可以下面这样
rm -rf `find /data/ -mtime +7 -type f -size +100k`

数十万や数百万など、削除するファイルが多すぎる場合は、xargsの使用はお勧めしません。パフォーマンスが良くありません。xargsを使用して職場で200,000を超えるKafkaトピックを削除し、一晩で削除したことがあるので、正直に言ってループを使用します。削除するだけです。通常、次のようなものを使用します。

for i in `find /data/ -mtime +7 -type f -size +100k`; do
echo "rm -rf $i" >> /tmp/tmp.sh
done

ただし、誰かが目の前で見せびらかしたり、他の人のスクリプトを見せびらかしたりしないように、この削除方法を理解する必要があります。

処理されたファイル名にスペースが含まれています

処理するファイルにスペースがあり、一部の特殊文字(ファイル名に特殊文字を含めることはできません)がある場合は、次の例に示すように、追加のパラメーターが必要です。

touch hello-world
touch "hello world1"
touch "hello world2"

[root@192_168_31_106 ~/xtmp]# ls | xargs ls
ls: cannot access hello: No such file or directory
ls: cannot access world1: No such file or directory
ls: cannot access hello: No such file or directory
ls: cannot access world2: No such file or directory
hello-world

可以看到,由于"hello world1"被拆分成了两个文件,所以报错文件找不到,我们可以通过 --null (或 -0)参数解决次问题
find . -type f  -print0 | xargs --null -n 1 ls

検索-print0とxargs--null
、スペースを含むファイル名の問題に対処するためによく使用されます。スペースを含むファイル名には多くの落とし穴があります。最初にビジネスシナリオを慎重に整理する必要があります。ファイル名にスペースが含まれるのはなぜですか。ソースからの問題を可能な限り解決するため。、ファイル名にスペースが存在しないようにするため。

実行するコマンドを印刷します

# -t OR --verbose 参数
[root@192_168_31_106 ~/xtmp]# echo 'one two three' | xargs -n 1 -t  touch
touch one 
touch two 
touch three 
[root@192_168_31_106 ~/xtmp]# ls
one  three  two

另一个测试
ls | xargs -t -I mytmp cp -a mytmp /tmp/

コマンドを実行する前に確認プロンプトを表示する

[root@192_168_31_106 ~/xtmp]# echo 'hello1 hello2 hello3' | xargs -n 1 -p  touch
touch hello1 ?...y
touch hello2 ?...y
touch hello3 ?...y
[root@192_168_31_106 ~/xtmp]# ls
hello1  hello2  hello3

可以输入 y/Y/yes 来表示确认执行

参照

http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html

おすすめ

転載: blog.csdn.net/xys2015/article/details/113870654