xargs命令的-I参数的语法规则是什么,该如何使用?
xargs -I 参数语法与使用说明
核心语法
标准使用格式如下:
<输出内容的命令> | xargs -I <自定义占位符> <要执行的目标命令>
-I 后面跟随的字符串就是你自定义的占位符,xargs会将管道传入的每一行输入内容作为一个整体,替换掉目标命令中所有和占位符一致的位置,再逐行执行替换后的命令。
注意:使用-I后xargs会强制按行拆分输入,不会默认按空格拆分内容,带空格的文件名/内容也可以正常处理,这是该参数和普通xargs用法最大的区别
实际使用示例
日常使用中大家习惯用{}作为占位符,你也可以根据需求换成任意不会和命令内容冲突的字符串:
- 示例1:批量给当前目录所有txt文件生成备份,备份后缀加.bak
命令:ls *.txt | xargs -I {} cp {} {}.bak
执行逻辑:如果当前目录有a.txt、测试 文件.txt两个文件,xargs会依次执行cp a.txt a.txt.bak、cp "测试 文件.txt" "测试 文件.txt.bak",带空格的文件也不会处理出错 - 示例2:自定义占位符批量删除指定文件
如果你提前把要删除的文件路径存在del_list.txt里,每行一个路径,可以执行:
命令:cat del_list.txt | xargs -I TARGET_FILE rm -rf TARGET_FILE
这里用TARGET_FILE作为占位符,和命令逻辑对应更清晰 - 示例3:结合find批量归档历史日志
搜索/var/log目录下超过30天未修改的log文件,移动到归档目录:
命令:find /var/log -type f -mtime +30 -name "*.log" | xargs -I {} mv {} /data/archive/log/ - 示例4:批量处理文本内容
给user_list.txt里每行存储的用户名批量发送通知邮件:
命令:cat user_list.txt | xargs -I USER sh -c 'echo "您好USER,系统将于今晚2点进行维护" | mail -s "系统维护通知" USER'
注意要点
- 占位符没有强制要求,只要和目标命令里的替换位置保持一致即可,避免和命令本身的参数、字符冲突就行
- 只要开启
-I参数,xargs每次只会处理一行输入、执行一次命令,不会把多行内容拼接成一次命令的参数 - 遇到内容包含引号、特殊字符的场景,
-I会自动把整行内容作为单个参数传递,不需要额外加转义符
内容的提问来源于stack exchange,提问作者cyly derder
相关产品推荐
相关产品推荐

