解释xargs

xargs - build and execute command lines from standard input

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件


#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
......

在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:


$ find / -name "core" -print | xargs echo "" >/tmp/core.log

上面这个执行太慢,我改成在当前目录下查找


#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6

在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:


# ls -l
drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf

用grep命令在所有的普通文件中搜索hostname这个词:


# find . -type f -print | xargs grep "hostname"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:


# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
<think>嗯,用户想了解xargs命令中的-L参数的作用和使用说明。首先,我需要回忆一下xargs的基本功能。xargs通常用于将标准输入的数据转换成命令行参数,这样可以将前一个命令的输出作为后一个命令的参数来处理。比如,结合find和rm删除大量文件时,可以避免“参数列表过长”的错误[^3]。 现在重点在-L参数。根据用户提供的引用,在示例中使用了-L 3,但结果和预期不同,说明-L可能被忽略了[^1]。这可能是因为同时使用了其他参数,比如-d,导致-L失效。我需要确认-L的正确用法。 查阅资料,-L参数后面应该跟一个数字,表示每次命令执行时使用的最大行数。比如-L 3会把输入分成每3行一组,作为参数传递给命令。但需要注意,当使用-d指定分隔符时,输入会被该分隔符分割,而不是按行分割,这时候-L可能会被忽略。比如用户提到的例子中用了-d"o",可能把输入按字母o分割,导致行数划分无效,因此-L 3没有起作用。 另外,用户引用的内容提到,当使用-L时,如果同时存在其他分割方式(比如-d或默认的空格、换行符分割),可能会影响-L的效果。例如,-d会改变输入的分割方式,导致按行分割的-L参数失效。因此,需要明确-L参数只在按行处理输入时有效,当使用其他分隔符时,可能不会按行分组。 总结一下,-L参数的作用是限制每次命令执行时使用的输入行数,但需要注意与其他参数(如-d)的兼容性。正确使用-L时,应该确保输入是按行分割的,没有其他分隔符干扰。例如,使用默认的换行符作为分隔符时,-L 3会将每3行合并为一组参数传递给命令。 另外,用户可能还关心如何验证-L的效果。可以举一个例子,比如用echo生成多行输入,然后通过xargs -L指定行数来观察输出。例如: echo -e "a\nb\nc\nd\ne" | xargs -L 2 这会每两行合并成一组参数,输出为“a b”、“c d”、“e”。这样用户就能直观看到-L的效果。 最后,需要提醒用户注意参数冲突的情况,比如同时使用-L和-d可能导致预期外的结果,这时候需要根据实际需求选择合适的参数组合。</think>### xargs命令中`-L`参数的使用说明 `-L`参数用于**限制每次命令执行时使用的输入行数**。其功能是将输入内容按行分组,每组包含指定数量的行,然后将每组作为参数传递给后续命令。以下是具体解释和示例: --- #### 1. **功能解释** - **作用**: 指定每次执行命令时使用的最大行数。例如,`-L 3`表示每次将连续3行的内容合并为一个参数组传递给命令。 - **输入分割**: 默认以换行符`\n`作为行分割符。若同时使用`-d`参数(自定义分隔符),`-L`可能失效。 - **冲突注意**: 当与`-n`参数(按条目数量分割)同时使用时,`-L`优先级更高,但实际效果需测试验证。 --- #### 2. **使用示例** **示例1:按行分组处理** ```bash # 输入内容为4行(a、b、c、d) echo -e "a\nb\nc\nd" | xargs -L 2 echo ``` **输出**: ``` a b c d ``` 说明:每2行合并为一组参数传递给`echo`。 **示例2:与文件操作结合** ```bash # 删除当前目录下所有.txt和.log文件(每3个文件为一组执行rm) find . -type f \( -name "*.txt" -o -name "*.log" \) -print | xargs -L 3 rm -f ``` 说明:避免因参数过多导致`Argument list too long`错误。 --- #### 3. **注意事项** - **与`-d`参数冲突**: 若使用`-d`指定自定义分隔符(如`xargs -d "o"`),输入内容将按该字符分割,不再按行处理,此时`-L`会被忽略。 - **替代方案**: 需要按固定条目数分组时,可优先使用`-n`参数(如`xargs -n 3`按3个参数为一组)。 --- #### 4. **参数对比表** | 参数 | 功能 | 分割依据 | 典型场景 | |--------|-----------------------|----------------|------------------------------| | `-L N` | 按行分组,每组N行 | 换行符`\n` | 按行合并输入(如日志处理) | | `-n N` | 按参数数量分组,每组N个 | 空格/换行符 | 批量执行命令(如删除文件) | | `-d C` | 自定义分隔符为C | 指定字符C | 处理特殊格式数据(如CSV) | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值