三三世界-百宝箱

文章 分类 标签
130 9 247

公告

暂无站点公告

/usr/bin/rm: Argument list too long参数列表过长的解决办法(xargs的应用)

三三 2022-07-17 2179 0条评论 Linux使用 centos删除文件缓存文件过多xargs

首页 / 正文

今天删除网站的缓存文件cache目录,30w+缓存记录,正常删除提示

/usr/bin/rm: Argument list too long

提示列表太长了。

这时候先进入指定的要删除的目录中,如:

cd /www/wwwroot/aaa.com/cache

执行这个命令完美解决:

ls | xargs -n 90 rm -rf

命令释义:

ls列出当前目录下的所有文件,以空格作为分隔, xargs是一个过滤器, -n 90 表示每90个文件作为一组,作为 命令 rm -rf 的参数,这样命令行就不会过长了。

友情提示:删除操作要谨慎!!

xargs命令常用参数和常见用法

xargs命令的作⽤,是将标准输⼊转为命令⾏参数。
xargs命令的格式如下。

xargs [-options] [command]

真正执⾏的命令,紧跟在xargs后⾯,接受xargs传来的参数。

之所以能⽤到这个命令,关键是由于很多命令不⽀持|管道来传递参数,⽽⽇常⼯作中⼜有这个必要,所以就有了 xargs 命令, 通过 xargs的处理,换⾏和空⽩将被空格取代。

xargs完成了两个⾏为:处理管道传输过来的stdin;将处理后的内容传递到正确的位置上。

常⽤的xargs参数主要分⼏类:

⼀)分割选项(xargs、 xargs -d、 xargs -0)
⼆)分批选项(xargs -n、 xargs -L、 xargs -i),其中-i也能传递替换
三)交互式处理(-p选项)和预先打印⼀遍命令的执⾏情况(-t选项)
四)传递终⽌符(-E选项)
xargs处理的优先级顺序:先分割,再分批,然后传递到参数位。

⼀)分割选项(xargs、 xargs -d、 xargs -0)

1)xargs后⾯的命令默认是echo

cat test.txt |xargs

# 等同于

cat test.txt |xargs echo

2)xargs -d选项

默认情况下,xargs将换⾏符和空格作为分隔符,把标准输⼊分解成⼀个个命令⾏参数-d参数可以更改分隔符

echo -e "a\tb\tc" | xargs -d "\t" echo

当处理有空格的⽂件名有时,可⽤其他⾮⽂件名中的字符来分隔,⽐如n,0

cd /tmp && ls |xargs -d"\n" rm -rf

3)xargs -0选项

由于xargs默认将空格作为分隔符,所以不太适合处理包含空格的⽂件名。

find命令有⼀个特别的参数-print0,指定输出的⽂件列表以ASCII码NUL ('0')分隔。然后,xargs命令的-0参数表⽰⽤ASCII码NUL ('0')当作分隔符。

$ find /path -type f -print0 | xargs -0 rm

#find的-print0和xargs的-0必须配合使⽤

上⾯命令删除/path路径下的所有⽂件。由于分隔符是NUL ('0'),所以处理包含空格的⽂件名,也不会报错。
xargs -0的⾏为和xargs -d基本是⼀样的,只是-d是指定分隔符,-0是指定固定的0作为分隔符。其实xargs -0就是特殊的xargs -d的⼀种,它等价于xargs -d"0"

xargs -0⼀般和find -print0配合使⽤。

针对含有空格的⽂件名两种处理⽅法:

⽅法1:使⽤0来分隔

find /tmp -name ".log" -print0 | xargs -0 rm -rf

能使⽤-0肯定也能使⽤-d了,随意指定⾮⽂件名中的字符都⾏,不⼀定⾮要0

find /tmp -name ".log" -print0 | xargs -d "x" rm -rf

⽅法2:⽤双引号来保证内容的完整性

find /tmp -name ".log" | xargs -i rm -rf "{}"

⼆)分批选项(xargs -n、 xargs -L、 xargs -i)

如果在⼀个xargs中使⽤了多个分批选项,则它们之间必然会冲突,它们的规则是:写在后⾯的⽣效,前⾯的分批选项被忽略。
当指定了-i选项之后会忽略-n和-L选项,它们的优先级从-n --> -L --> -i逐渐变⾼,当指定⾼优先级的分批选项会覆盖低优先级的分批选项。

1)xargs -n选项

-n参数指定每次将多少项作为命令⾏参数。

echo {0..9} | xargs -n 2 echo

上⾯命令指定,每两个参数运⾏⼀次echo命令。所以,10个阿拉伯数字运⾏了五次echo命令,输出了五⾏

2)xargs -L选项

如果标准输⼊包含多⾏,-L参数指定多少⾏作为⼀个命令⾏参数

echo -e "a\nb\nc" | xargs -L1 echo

上⾯代码指定每⾏运⾏⼀次echo命令,所以echo命令执⾏了三次,输出了三⾏。

xargs -n选项和-L选项的区别

cat test.txt
'''
this is first line
this is second line
the 3nd line
the end
'''
cat test.txt |xargs -n1

# -n参数默认是按空格分隔

'''
this
is
first
line
this
is
second
line
the
3nd
line
the
end
'''
cat test.txt |xargs -L1

# -L参数默认是按⾏分隔,并且是⾮空⾏

'''
this is first line
this is second line
the 3nd line
the end
'''

3)xargs -i选项
如果不使⽤-i,则默认是将分割后处理后的结果整体传递到命令的最尾部。但是有时候需要传递到多个位置,不使⽤-i就不知道传递到哪个位置了。

使⽤xargs -i时以⼤括号{}作为替换符号,传递的时候看到{}就将被结果替换。可以将{}放在任意需要传递的参数位上,如果多个地⽅使⽤{}就实现了多个传递。

find /server/ -name "*.bak"|xargs -i echo {} {}|sed 's/.bak//2'|xargs -L1 mv

#批量改名

4)xargs -I选项

xargs -I(⼤写字母i)和xargs -i是⼀样的,只是-i默认使⽤⼤括号{}作为替换符号,-I则可以指定其他的符号、字母、数字作为替换符号,但是必须⽤引号包起来。man推荐使⽤-I代替-i,但是⼀般都使⽤-i图个简单,除⾮在命令中不能使⽤⼤括号,如touch {1..1000}.txt时⼤括号就不能⽤来做替换符号。

-I 选项的另⼀种⽤法:

如果xargs要将命令⾏参数传给多个命令,可以使⽤-I参数。

-I指定每⼀项命令⾏参数的替代字符串。

cat test.txt | xargs -I file sh -c 'echo file; mkdir file'

上⾯代码中,test.txt是⼀个三⾏的⽂本⽂件。我们希望对每⼀项命令⾏参数,执⾏两个命令(echo和mkdir),使⽤-I file表⽰file是命令⾏参数的替代字符串。执⾏命令时,具体的参数会替代掉echo file; mkdir file⾥⾯的两个file分批选项有时特别有⽤,有时候命令提⽰参数列表过长,就可以使⽤分批选项

cd /tmp && ls |xargs -n 10000 rm -rf #每次只删除10000个

三)交互式处理(-p和-t)

-p和-t参数⼀般⽤来做测试
-p参数打印出要执⾏的命令,询问⽤户是否要执⾏
echo 'one two three' | xargs -p touch
-t参数则是打印出最终要执⾏的命令,然后直接执⾏,不需要⽤户确认

echo 'one two three' | xargs -t rm

四)传递终⽌符(-E选项)

xargs -E 指定终⽌符号

cat test.txt |xargs -n1 -E "3nd"
cat test.txt |xargs -L1 -E "3nd"

#和-i配合使⽤时指定完整的段才可以

cat test.txt |xargs -i -E "the 3nd line" echo {}

扩展阅读

xargs是 Unix 系统的一个很有用的命令,但是常常被忽视,很多人不了解它的用法。

本文介绍如何使用这个命令。

一、标准输入与管道命令
Unix 命令都带有参数,有些命令可以接受"标准输入"(stdin)作为参数。

$ cat /etc/passwd | grep root

上面的代码使用了管道命令(|)。管道命令的作用,是将左侧命令(cat /etc/passwd)的标准输出转换为标准输入,提供给右侧命令(grep root)作为参数。

因为grep命令可以接受标准输入作为参数,所以上面的代码等同于下面的代码。

$ grep root /etc/passwd

但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。举例来说,echo命令就不接受管道传参。

$ echo "hello world" | echo

上面的代码不会有输出。因为管道右侧的echo不接受管道传来的标准输入作为参数。

二、xargs 命令的作用
xargs命令的作用,是将标准输入转为命令行参数。

$ echo "hello world" | xargs echo
hello world

上面的代码将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。

xargs命令的格式如下。

$ xargs [-options] [command]

真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。

xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。

$ echo "one two three" | xargs mkdir

上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。

三、xargs 的单独使用
xargs后面的命令默认是echo。

$ xargs
# 等同于
$ xargs echo

大多数时候,xargs命令都是跟管道一起使用的。但是,它也可以单独使用。

输入xargs按下回车以后,命令行就会等待用户输入,作为标准输入。你可以输入任意内容,然后按下Ctrl d,表示输入结束,这时echo命令就会把前面的输入打印出来。

$ xargs
hello (Ctrl + d)
hello

再看一个例子。

$ xargs find -name
"*.txt"
./foo.txt
./hello.txt

上面的例子输入xargs find -name以后,命令行会等待用户输入所要搜索的文件。用户输入".txt",表示搜索当前目录下的所有 TXT 文件,然后按下Ctrl d,表示输入结束。这时就相当执行find -name .txt。

四、-d 参数与分隔符
默认情况下,xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。

$ echo "one two three" | xargs mkdir

上面代码中,mkdir会新建三个子目录,因为xargs将one two three分解成三个命令行参数,执行mkdir one two three。

-d参数可以更改分隔符。

$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c

上面的命令指定制表符t作为分隔符,所以atbtc就转换成了三个命令行参数。echo命令的-e参数表示解释转义字符。

五、-p 参数,-t 参数

使用xargs命令以后,由于存在转换参数过程,有时需要确认一下到底执行的是什么命令。

-p参数打印出要执行的命令,询问用户是否要执行。

$ echo 'one two three' | xargs -p touch
touch one two three ?...

上面的命令执行以后,会打印出最终要执行的命令,让用户确认。用户输入y以后(大小写皆可),才会真正执行。

-t参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认。

$ echo 'one two three' | xargs -t rm
rm one two three

六、-0 参数与 find 命令

由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。

find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。

 
$ find /path -type f -print0 | xargs -0 rm

上面命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名,也不会报错。

还有一个原因,使得xargs特别适合find命令。有些命令(比如rm)一旦参数过多会报错"参数列表过长",而无法执行,改用xargs就没有这个问题,因为它对每个参数执行一次命令。

$ find . -name "*.txt" | xargs grep "abc"

上面命令找出所有 TXT 文件以后,对每个文件搜索一次是否包含字符串abc。

七、-L 参数
如果标准输入包含多行,-L参数指定多少行作为一个命令行参数。

$ xargs find -name
"*.txt"   
"*.md"

find: paths must precede expression: `*.md'

上面命令同时将".txt"和.md两行作为命令行参数,传给find命令导致报错。

使用-L参数,指定每行作为一个命令行参数,就不会报错。

$ xargs -L 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./README.md

上面命令指定了每一行(-L 1)作为命令行参数,分别运行一次命令(find -name)。

下面是另一个例子。

$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c

上面代码指定每行运行一次echo命令,所以echo命令执行了三次,输出了三行。

八、-n 参数
-L参数虽然解决了多行的问题,但是有时用户会在同一行输入多项。

$ xargs find -name
"*.txt" "*.md"
find: paths must precede expression: `*.md'

上面的命令将同一行的两项作为命令行参数,导致报错。

-n参数指定每次将多少项,作为命令行参数。

 $ xargs -n 1 find -name

上面命令指定将每一项(-n 1)标准输入作为命令行参数,分别执行一次命令(find -name)。

下面是另一个例子。

$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9

上面命令指定,每两个参数运行一次echo命令。所以,10个阿拉伯数字运行了五次echo命令,输出了五行。

九、-I 参数
如果xargs要将命令行参数传给多个命令,可以使用-I参数。

-I指定每一项命令行参数的替代字符串。

$ cat foo.txt
one
two
three
 
$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one 
two
three
 
$ ls 
one two three

上面代码中,foo.txt是一个三行的文本文件。我们希望对每一项命令行参数,执行两个命令(echo和mkdir),使用-I file表示file是命令行参数的替代字符串。执行命令时,具体的参数会替代掉echo file; mkdir file里面的两个file。

十、--max-procs 参数
xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。

--max-procs参数指定同时用多少个进程并行执行命令。--max-procs 2表示同时最多使用两个进程,--max-procs 0表示不限制进程数。

 
$ docker ps -q | xargs -n 1 --max-procs 0 docker kill

上面命令表示,同时关闭尽可能多的 Docker 容器,这样运行速度会快很多。

评论(0)

当前没有评论,还不快来留下第一个脚印吧


Copyright 2021 三三世界-百宝箱. All Rights Reserved.

最新评论

  • 三三

    @Doug Shume it's ok for me , you can post here.

  • refugiaguenther

    Saved as a favorite, I like your website!

  • josefa

    If some one wishes to be updated with hottest technologies after that he must be visit this site and be up to date daily.

  • Penzu

    Heello would you mind sharing which blog platform you're using? I'm planning to start my own blog in the near future but I'm having a tough time making a decision between BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your layout seems different then moost blogs and I'm looking for something completely unique. P.S Apologies forr being off-topic butt I had to ask!

  • Yupoo Fendi

    Thanks to my father who shared with me regarding this webpage, this website is genuinely amazing.

  • Doug Shume

    Hi, I have an overflow of customers that I'd like to send to you but I want to make sure you can handle more leads, let me know if you'd like me to send you more info.

  • SuperWind

    zh.us.to 有效
    kms.03k.org 有效
    kms.chinancce.com
    kms.shuax.com 有效
    kms.dwhd.org 有效
    kms.luody.info 有效
    kms.digiboy.ir 有效
    kms.lotro.cc 有效
    www.zgbs.cc 有效
    cy2617.jios.org 有效

  • 三三

    @         权限问题,试试sudo 再加命令。

  •         

    你好提示Permission denied 怎么办啊

日历

2024年05月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

上一张 下一张