今天删除网站的缓存文件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 容器,这样运行速度会快很多。
版权属于: 三三世界-百宝箱
本文链接: http://33f.net/linux/cetnos_rm_list_too_long.html
本文最后更新于2022年07月17日 ,已超过504天没有更新,若内容或图片失效,请留言反馈。
本文允许转载,但请在转载时请以超链接或其它形式标明文章出处
@ 权限问题,试试sudo 再加命令。
你好提示Permission denied 怎么办啊