Xargs用法详解及rm -bash too long

本文深入探讨了Xargs命令的使用方法、选项解释及实际应用案例,详细介绍了如何通过Xargs实现复杂的数据处理任务。

Xargs用法详解

1. 简介

  之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如:

find /sbin -perm +700 |ls -l       这个命令是错误的

find /sbin -perm +700 |xargs ls -l   这样才是正确的

xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了~他的用法其实也还满简单的!就来看一看先!

2. 选项解释

-0 sdtin含有特殊字元时候,将其当成一般字符,想/'空格等

例如:root@localhost:~/test#echo "//"|xargs  echo 

      root@localhost:~/test#echo "//"|xargs -0 echo 

       /

-a file 从文件中读入作为sdtin,(看例一)

-e flag ,注意有的时候可能会是-Eflag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。(例二)

-p 当每次执行一个argument的时候询问一次用户。(例三)

-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。(例四)

-t 表示先打印命令,然后再执行。(例五)

-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。(例六)

-r no-run-if-empty xargs的输入为空的时候则停止xargs,不用再去执行了。(例七)

-s num 命令行的最好字符数,指的是xargs后面那个命令的最大命令行字符数。(例八)

 

-L  num Use at most max-lines nonblank input lines per command line.-s是含有空格的。

-l  同-L

-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符(例九)

-x exit的意思,主要是配合-s使用。

-修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。

3. 应用举例

例一:

root@localhost:~/test#cat test 

#!/bin/sh

echo "hello world/n"

root@localhost:~/test#xargs -a test echo

#!/bin/sh echo hello world/n

root@localhost:~/test#

例二:

root@localhost:~/test#cat txt

/bin tao shou kun

root@localhost:~/test#cat txt|xargs -E 'shou' echo

/bin tao

root@localhost:~/test#

例三:

root@localhost:~/test#cat txt|xargs -p echo

echo /bin tao shou kun ff ?...y

/bin tao shou kun ff

例四:

root@localhost:~/test#cat txt|xargs -n1 echo

/bin

tao

shou

kun

root@localhost:~/test3#cat txt|xargs  echo

/bin tao shou kun

例五:

root@localhost:~/test#cat txt|xargs -t echo

echo /bin tao shou kun 

/bin tao shou kun

例六:

$ ls | xargs -t -i mv {} {}.bak

例七:

root@localhost:~/test#echo ""|xargs -t mv

mv 

mv: missing file operand

Try `mv --help' for more information.

root@localhost:~/test#echo ""|xargs -t -r  mv

root@localhost:~/test#

(直接退出)

例八:

root@localhost:~/test#cat test |xargs -i -x  -s 14 echo "{}"

exp1

exp5

file

xargs: argument line too long

linux-2

root@localhost:~/test#

例九:

root@localhost:~/test#cat txt |xargs -i -p echo {}

echo /bin tao shou kun ?...y

root@localhost:~/test#cat txt |xargs -i -p -d " " echo {}

echo /bin ?...y

echo tao ?.../bin

y

echo shou ?...tao

再如:

root@localhost:~/test#cat test |xargs -i -p -d " " echo {}

echo exp1

exp5

file

linux-2

ngis_post

tao

test

txt

xen-3

 ?...y

root@localhost:~/test#cat test |xargs -i -p echo {}

echo exp1 ?...y

echo exp5 ?...exp1

y

echo file ?...exp5

y





有的时候使用rm -rf 时报错-bash  too long 什么的,可以使用分割删除如下:



ls | xargs -n 100rm -rf ls

输出所有的文件名(用空格分割) xargs就是将ls的输出,每100个为一组(以空格为分隔符)

作为rm -rf的参数也就是说将所有文件名100个为一组,由rm -rf删除










此文转自:http://blog.youkuaiyun.com/zhangfn2011/article/details/6776925

<think> 首先,用户的问题是:"我想查找解决 -bash: /bin/cp: Argument list too long 错误的方法"。用户指定了要解决这个特定的Linux错误。 从系统级指令看: - 所有行内数学表达式必须使用$...$格式。但在这个问题中,可能没有数学表达式。 - 独立公式使用$$...$$格式,但同样,可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 用户提供了几个引用: - 引用[1]:提到cp或mv命令出错,Argument list too long,解决方案是使用find -exec。 - 引用[2]:解释错误是由于文件数量过多导致的。 - 引用[3]:详细解决方案,使用find命令配合-exec或-mdelete。 - 引用[4]:类似,针对rm命令,但解决方案通用。 用户说这些引用仅供参考,不是真正的需求,但我要尽可能多地参考用户上一次的问题和我的回答。然而,在对话历史中,上一次问题是快速排序的示例,不是直接相关。这是新的问题序列的开始。 我的角色是提供帮助。用户的问题是解决"-bash: /bin/cp: Argument list too long"错误。 基于引用,解决方案的核心是使用find命令来处理大量文件,因为通配符如*会扩展成很长的参数列表,超过系统限制。 常见解决方法: 1. 使用find命令配合-exec选项。 2. 使用xargs命令。 3. 使用循环如for loop。 从引用[3]和[4]中: - 对于cp:find SRC_DIR -name "*.jpg" -exec cp {} DST_DIR/ \; - 对于mv:类似。 - 对于rm:find DIR -type f -exec rm {} \; 用户特别提到cp命令。 回答结构: - 解释错误原因。 - 提供解决方案。 - 一步步指导。 - 在引用内容末尾添加引用标识。 - 最后,生成相关问题。 使用中文回答。 大纲回答: 1. **解释错误**:当使用cp、mv或rm等命令时,如果文件数量过多,通配符(如*)会生成过长的参数列表,导致错误。原因是在Linux系统中,参数列表的大小有限制(大约2MB)。[^2] 2. **解决方案**: - 使用find命令:例如,复制文件:find . -name "*.jpg" -exec cp {} /target/dir/ \; - 使用xargs命令:ls *.jpg | xargs -I {} cp {} /target/dir/ - 使用for循环:for file in *.jpg; do cp "$file" /target/dir/; done 3. 提供示例代码块(虽然不是Python,但用户问题涉及bash)。 4. 添加引用标识:引用末尾加[^1], [^2], [^3], [^4]。 5. **生成相关问题**:在回答末尾添加几个相关问题。 生成相关问题: - 如何避免Argument list too long错误? - 使用xargs命令的更多例子是什么? - 如何调整系统参数来增加参数列表大小? - 还有其他命令如tar或rsync来处理大量文件吗? 确保回答清晰、可靠。 </think> ### 解决 "-bash: /bin/cp: Argument list too long" 错误的方法 在 Linux 系统中,当使用 `cp`, `mv` 或 `rm` 命令处理大量文件时(例如 `cp *.jpg /target_dir/`),可能会遇到错误 `-bash: /bin/cp: Argument list too long`。这是因为通配符(如 `*`)会将所有匹配的文件名扩展为一个过长的参数列表,超出系统限制(通常为 2MB 左右的最大参数长度)[^2]。以下提供多种可靠的解决方案,逐步指导您解决此问题。核心思路是使用替代方法来分批处理文件,避免一次性传递过多参数。 #### 方案 1: 使用 `find` 命令配合 `-exec` 选项 这是最推荐的方法,直接遍历文件并执行操作,无需扩展参数列表。 - **步骤**: 1. 确保目标目录存在(如不存在,先用 `mkdir /target_dir` 创建)。 2. 在源目录运行以下命令: ```bash find source_dir/ -name "*.jpg" -exec cp -t /target_dir/ {} + ``` - **命令解析**: - `find source_dir/`: 从 `source_dir/` 目录开始搜索。 - `-name "*.jpg"`: 只匹配扩展名为 `.jpg` 的文件(替换为您的文件模式)。 - `-exec cp -t /target_dir/ {} +`: - `-exec`: 对每个匹配文件执行后续命令。 - `cp -t /target_dir/`: `-t` 选项指定目标目录,提高效率。 - `{}`: 占位符,代表当前找到的文件。 - `+`: 分批处理文件(比 `\;` 更快,因为它一次传递多个文件)。 - **示例**:将所有 `.png` 文件从 `005_数据/` 复制到 `006_数据/`: ```bash find 005_数据/ -name "*.png" -exec cp -t 006_数据/ {} + ``` 3. 验证:使用 `ls /target_dir/ | wc -l` 检查文件数量是否匹配。 - **优点**:高效安全,支持分批处理,避免内存溢出[^3]。 #### 方案 2: 使用 `xargs` 命令(配合管道) `xargs` 命令从标准输入读取文件名,并分批传递给其他命令,适合处理大量文件。 - **步骤**: 1. 使用 `ls` 或 `find` 生成文件列表,然后通过管道传递给 `xargs`: ```bash find source_dir/ -name "*.jpg" -print0 | xargs -0 cp -t /target_dir/ ``` - **命令解析**: - `-print0`: 输出文件名以空字符分隔(避免空格问题)。 - `xargs -0`: 读取空字符分隔的输入。 - `cp -t /target_dir/`: 同上,复制到目标目录。 - **替代命令**(如果文件数量可控): ```bash printf '%s\0' source_dir/*.jpg | xargs -0 cp -t /target_dir/ ``` 2. **示例**:移动文件而非复制(使用 `mv`): ```bash find source_dir/ -name "*.jpg" -print0 | xargs -0 mv -t /target_dir/ ``` - **优点**:灵活,可结合其他命令,适合脚本自动化[^4]。 #### 方案 3: 使用 Bash 循环(简单场景适用) 对于少量文件或简单任务,可以用 `for` 循环逐个处理文件(但效率较低,不推荐超大目录)。 - **步骤**: ```bash for file in source_dir/*.jpg; do cp "$file" /target_dir/ done ``` - **注意**:如果文件过多仍可能慢,但不会触发参数过长错误。 #### 其他建议 - **检查系统限制**:用 `getconf ARG_MAX` 查看最大参数大小(单位为字节),但修改系统限制(如通过 `ulimit`)不推荐,因可能引发不稳定。 - **替代工具**:使用 `rsync` 或 `tar` 处理大规模文件更高效(例如 `rsync -av source_dir/*.jpg /target_dir/`),但当文件数极大时仍可能需分批。 - **错误预防**:操作前先用 `find source_dir/ -name "*.jpg" -exec ls {} +` 列出文件预览,避免误操作[^3]。 通过以上方法,您可高效解决 `Argument list too long` 错误。根据文件数量和系统环境选择合适的方案,优先推荐 `find -exec` 或 `xargs` [^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值