前提
- find 可以可 exec 结合执行命令,但是 exec 是要等 find 命令执行完成之后才对 find 执行完成的结果进行操作,然而很不幸的是当文件太多的时候会出现文件队列过长的提示
- 因为 linux 有个临时内存地址只保存 128K 的数据,我们有个服务器目录中有数万的文件,要对其进行分类,使用 exec 就不行,因此就到了 xargs 大显身手的时候了
- find 查找文件,xargs 把 find 查找到的结果当做输入进行下一步的具体操作
常用参数
- -0,当 sdtin 含有特殊字元时候,将其当成一般字符,例如
~]# echo "%" | xargs -0 echo > 1
~]# cat 1
%
-
-a file 从文件中读入作为 sdtin
image.png
-
-e flag ,注意有的时候可能会是 -E,flag 必须是一个以空格分隔的标志,当 xargs 分析到含有 flag 这个标志的时候就停止
~]# cat 1.txt
find a test file!
~]# cat 1.txt | xargs -E "test" echo
find a
-
-p 当每次执行一个 argument 的时候询问一次用户
image.png
-
-n num 后面加次数,表示命令在执行的时候一次用的 argument 的个数,默认是用所有的
~]# cat 1.txt
find a test file!
~]# cat 1.txt | xargs -n2 echo
find a
test file!
-
-t 表示先打印命令,然后再执行
-
-i 或者是-I,这得看 linux 支持了,将 xargs 的每项名称,一般是一行一行赋值给{},可以用{}代替,可以用于对文件移动等操作
find的时间是从执行时间开始往前 24 小时为一天,如果是 -ctime +1 则是上一天当前时间之前的文件
~]# find /data/ftpsite/pmsc/radar/latlon/single/ -type f -mtime +1 | xargs -t -i mv {} /data/ftpsite/pmsc/radar/latlon/history/
~]# find /data/ftpsite/pmsc/radar/latlon/single/ -type f -mtime +1 | xargs -t -i cp {} /data/history/
~]# /bin/find /data/ftpsite/pmsc/radar/latlon/single/ -type f -ctime +2 | xargs rm -rf # 直接删除匹配到的文件,一定要指定类型,不然匹配到目录也统统删除
~]# /bin/find /data/ftpsite/pmsc/radar/latlon/single/ -type f -mtime +2 | xargs -t -i rm -rf {} # 适用于数量众多的文件删除且显示每一条执行的 shell 命令

-
-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 使用
-
-P 修改最大的进程数,默认是 1,为 0 时候为 as many as it can ,这个例子我没有想到,应该平时都用不到
网友评论