xargs是一个常用的Shell命令,用于将标准输入数据转换为命令行参数,并将这些参数传递给其他命令进行处理。它可以帮助我们更灵活地处理和操作输入数据,在 shell 中,xargs
常用于处理大量的文件名或者其他参数,它可以将这些参数分批处理,避免一次性处理过多的参数而导致命令行溢出。
基本语法:
command | xargs [options] [command]
常用选项:
-I placeholder:用placeholder替代待替换的参数。
-n num:指定每次传递给命令的参数数量。
-P maxprocs:指定并行执行的最大进程数。
-t:在运行命令之前打印出要执行的命令。
示例1:将标准输入的每一行作为参数传递给命令echo进行输出。
$ echo "apple banana cherry" | xargs echo
apple banana cherry
示例2:使用-I选项,将输入的每一行作为参数传递给命令echo进行输出。
$ echo "apple banana cherry" | xargs -I {} echo {}
apple banana cherry
示例3:从文件中读取每一行,并将每行内容作为参数传递给命令ls进行文件查找。
$ cat filenames.txt | xargs ls
file1.txt file2.txt file3.txt
示例4:使用-n选项,指定每次传递给命令的参数数量为2,将多个参数一起传递给命令echo。
$ echo "apple banana cherry" | xargs -n 2 echo
apple banana
cherry
示例5:使用-P选项,指定并行执行的最大进程数为2,并行执行命令echo。
$ echo "apple banana cherry" | xargs -P 2 -I {} echo {}
apple
banana
cherry
示例6:从find命令的输出中获取文件列表,并使用xargs将这些文件传递给grep命令进行搜索。
$ find . -name "*.txt" | xargs grep "keyword"
./file1.txt: This is a line containing the keyword.
./file2.txt: Another line with the keyword.
示例7. 将文件名传递给其他命令:
$ find . -name "*.txt" | xargs cat
这个命令会在当前目录下查找所有扩展名为 .txt
的文件,然后将它们的内容合并到一起输出。
示例8. 删除多个文件:
$ find . -name "*.bak" | xargs rm
这个命令会在当前目录下查找所有扩展名为 .bak
的文件,然后将它们全部删除。
示例9. 批量运行命令:
$ echo "file1 file2 file3" | xargs -n 1 sh -c 'ls $0'
这个命令会将字符串 file1 file2 file3
作为标准输入,然后将每个单词作为参数传递给 ls
命令,最终输出每个文件的详细信息。
示例10. 并行处理任务:
$ find . -name "*.jpg" | xargs -P 4 -I {} convert {} -resize 50% {}
这个命令会在当前目录下查找所有扩展名为 .jpg
的文件,然后使用 convert
命令将它们的尺寸缩小一半。-P 4
选项指定了并行处理的进程数,-I {}
选项指定了替换字符串为 {}
,这样可以将每个文件名替换成命令行参数。