欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

很不理解为什么 -print0 | xargs -0 rm 有大用

find /opt/newcms/public/360/newbox/yun/test/  -type f -name 'list*' -print0 | xargs -0 rm



很不理解为什么 -print0 | xargs -0 rm

为什么都要有个0?

       问了下smile,原来xargs 默认是以空白字符来做分割的,当执行rm时候,如果查找出来的文件名中有空格,那就容易把类似于 test 1.php  当做test  和 1.php来删除。

为了解决这个问题,在打印出每一条记录后,在后面输入一个结束符,代替原来的换行符,然后再以换行符来分割每一条记录,就会保证每一条的唯一性。

     为什么不用-exec,而用xargs ?因为find会把找到的记录都给后面的命令传过去执行,-exec有长度限制,可能会出现参数溢出。

来自  https://blog.csdn.net/xu_ya_fei/article/details/41514993


很不理解为什么 -print0 | xargs -0 rm


find /opt/newcms/public/360/newbox/yun/test/  -type f -name 'list*' -print0 | xargs -0 rm



很不理解为什么 -print0 | xargs -0 rm

为什么都要有个0?

       问了下smile,原来xargs 默认是以空白字符来做分割的,当执行rm时候,如果查找出来的文件名中有空格,那就容易把类似于 test 1.php  当做test  和 1.php来删除。

为了解决这个问题,在打印出每一条记录后,在后面输入一个结束符,代替原来的换行符,然后再以换行符来分割每一条记录,就会保证每一条的唯一性。

     为什么不用-exec,而用xargs ?因为find会把找到的记录都给后面的命令传过去执行,-exec有长度限制,可能会出现参数溢出。


来自 https://blog.csdn.net/xu_ya_fei/article/details/41514993


find命令中的print0和xargs -0


看到命令find . -name '*.h' -print0 | xargs -0 checkout-cache -f --


不明白其中-print0和 xargs -0的用法。查了一下,转载一篇备忘。


xargs命令的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题


以下内容转自http://blog.163.com/laser_meng@126/blog/static/16972784420117102638257/

默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的:

-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:09 file1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:09 file2.log
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log'
./file2.log
./file1.log
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; bye

比如我想把所有的 .log 文件删掉, 可以这样配合 xargs 一起用:
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log'
./file2.log
./file1.log
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log' | xargs rm
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log'
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; bye

嗯, 不错, find+xargs 真的很强大. 然而:
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log'
./file 1.log
./file 2.log
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log' | xargs rm
rm: cannot remove `./file': No such file or directory
rm: cannot remove `1.log': No such file or directory
rm: cannot remove `./file': No such file or directory
rm: cannot remove `2.log': No such file or directory
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; bye

原因其实很简单, xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 ./file 1.log 被解释成了两个记录 ./file  1.log, 不幸的是 rm 找不到这两个文件.

为了解决此类问题, 聪明的人想出了一个办法, 让 find 在打印出一个文件名之后接着输出一个 NULL 字符 ('\0') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的 -0 的来历吧.
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log' -print0 | hd
           0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F  |0123456789ABCDEF|
--------+--+--+--+--+---+--+--+--+---+--+--+--+---+--+--+--+--+----------------|
00000000: 2e 2f 66 69  6c 65 20 31  2e 6c 6f 67  00 2e 2f 66  |./file 1.log../f|
00000010: 69 6c 65 20  32 2e 6c 6f  67 00                     |ile 2.log.      |
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log' -print0 | xargs -0 rm
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; find -name '*.log'
-(dearvoid@LinuxEden:Forum)-(~/tmp/find)-
[bash-4.1.5]
 ; bye

你可能要问了, 为什么要选 '\0' 而不是其他字符做分隔符呢? 这个也容易理解: 一般的编程语言中都用 '\0' 来作为字符串的结束标志, 文件的路径名中不可能包含 '\0' 字符.

来自  https://blog.csdn.net/GSYzhu/article/details/38115529

linux find命令-print0和xargs中-0使用技巧(转载)


本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下。

本节内容:
linux find命令中-print0和xargs中-0的用法。

默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此find 的输出都是一行一行的:
 

[bash-4.1.5] ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:09 file1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:09 file2.log
[bash-4.1.5] find -name '*.log'
./file2.log
./file1.log
比如用find命令把所有的 .log 文件删掉, 可以这样配合 xargs 一起用:
 

[bash-4.1.5] find -name '*.log'
./file2.log
./file1.log
[bash-4.1.5] find -name '*.log' | xargs rm
[bash-4.1.5] find -name '*.log'
find命令结合xargs 真的很强大. 然而:
 

[bash-4.1.5] ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log
[bash-4.1.5] find -name '*.log'
./file 1.log
./file 2.log
[bash-4.1.5] find -name '*.log' | xargs rm
rm: cannot remove `./file': No such file or directory
rm: cannot remove `1.log': No such file or directory
rm: cannot remove `./file': No such file or directory
rm: cannot remove `2.log': No such file or directory
 
原因其实很简单, xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 ./file 1.log 被解释成了两个记录 ./file 和 1.log, 不幸的是 rm 找不到这两个文件.

为了解决此类问题, 让 find命令在打印出一个文件名之后接着输出一个 NULL 字符 ('') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的 -0 的来历吧.
 

[bash-4.1.5] ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log
[bash-4.1.5] find -name '*.log' -print0 | hd
0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
--------+--+--+--+--+---+--+--+--+---+--+--+--+---+--+--+--+--+----------------|
00000000: 2e 2f 66 69 6c 65 20 31 2e 6c 6f 67 00 2e 2f 66 |./file 1.log../f|
00000010: 69 6c 65 20 32 2e 6c 6f 67 00 |ile 2.log. |
[bash-4.1.5] find -name '*.log' -print0 | xargs -0 rm
[bash-4.1.5] find -name '*.log'
 
你可能要问了, 为什么要选 '' 而不是其他字符做分隔符呢? 这个也容易理解: 一般的编程语言中都用 '' 来作为字符串的结束标志, 文件的路径名中不可能包含 '' 字符.

分享一些find命令与xargs的实例:

删除以html结尾的10天前的文件,包括带空格的文件:
 

find /usr/local/backups -name "*.html" -mtime +10 -print0 |xargs -0 rm -rfvfind /usr/local/backups -mtime +10 -name "*.html" -exec rm -rf {} ;
 
find -print 和 -print0的区别:

-print 在每一个输出后会添加一个回车换行符,而-print0则不会。
当前目录下文件从大到小排序(包括隐藏文件),文件名不为".":
 

find . -maxdepth 1 ! -name "." -print0 | xargs -0 du -b | sort -nr | head -10 | nl
nl:可以为输出列加上编号,与cat -n相似,但空行不编号
以下功能同上,但不包括隐藏文件:
 

for file in *; do du -b "$file"; done|sort -nr|head -10|nlx
args结合sed替换:
 

find . -name "*.txt" -print0 | xargs -0 sed -i 's/aaa/bbb/g'
xargs结合grep:
 

find . -name '*.txt' -type f -print0 |xargs -0 grep -n 'aaa'    #“-n”输出行号


文章来自:http://www.cnblogs.com/jjzd/p/5829558.html


来自  https://blog.csdn.net/u014448841/article/details/76223796


linux find -print 和 -print0的区别


man find的结果如下:
find <wbr>-print <wbr>和 <wbr>-print0的区别
-print 在每一个输出后会添加一个回车换行符,而-print0则不会。
[root@AaronWong shell_test]# find /home/AaronWong/ABC/ -type l -print
/home/AaronWong/ABC/libcvaux.so
/home/AaronWong/ABC/libgomp.so.1
/home/AaronWong/ABC/libcvaux.so.4
/home/AaronWong/ABC/libcv.so
/home/AaronWong/ABC/libhighgui.so.4
/home/AaronWong/ABC/libcxcore.so
/home/AaronWong/ABC/libhighgui.so
/home/AaronWong/ABC/libcxcore.so.4
/home/AaronWong/ABC/libcv.so.4
/home/AaronWong/ABC/libgomp.so
/home/AaronWong/ABC/libz.so
/home/AaronWong/ABC/libz.so.1
[root@AaronWong shell_test]# find /home/AaronWong/ABC/ -type l -print0
/home/AaronWong/ABC/libcvaux.so/home/AaronWong/ABC/libgomp.so.1/home/AaronWong/ABC/libcvaux.so.4/hom


来自  https://blog.csdn.net/xiaotengyi2012/article/details/8239712


linux find命令-print0和xargs中-0使用技巧(转载)


本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下。

本节内容:
linux find命令中-print0和xargs中-0的用法。

默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此find 的输出都是一行一行的:
 

[bash-4.1.5] ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:09 file1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:09 file2.log
[bash-4.1.5] find -name '*.log'
./file2.log
./file1.log
比如用find命令把所有的 .log 文件删掉, 可以这样配合 xargs 一起用:
 

[bash-4.1.5] find -name '*.log'
./file2.log
./file1.log
[bash-4.1.5] find -name '*.log' | xargs rm
[bash-4.1.5] find -name '*.log'
find命令结合xargs 真的很强大. 然而:
 

[bash-4.1.5] ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log
[bash-4.1.5] find -name '*.log'
./file 1.log
./file 2.log
[bash-4.1.5] find -name '*.log' | xargs rm
rm: cannot remove `./file': No such file or directory
rm: cannot remove `1.log': No such file or directory
rm: cannot remove `./file': No such file or directory
rm: cannot remove `2.log': No such file or directory
 
原因其实很简单, xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 ./file 1.log 被解释成了两个记录 ./file 和 1.log, 不幸的是 rm 找不到这两个文件.

为了解决此类问题, 让 find命令在打印出一个文件名之后接着输出一个 NULL 字符 ('') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的 -0 的来历吧.
 

[bash-4.1.5] ls -l
total 0
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log
-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log
[bash-4.1.5] find -name '*.log' -print0 | hd
0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
--------+--+--+--+--+---+--+--+--+---+--+--+--+---+--+--+--+--+----------------|
00000000: 2e 2f 66 69 6c 65 20 31 2e 6c 6f 67 00 2e 2f 66 |./file 1.log../f|
00000010: 69 6c 65 20 32 2e 6c 6f 67 00 |ile 2.log. |
[bash-4.1.5] find -name '*.log' -print0 | xargs -0 rm
[bash-4.1.5] find -name '*.log'
 
你可能要问了, 为什么要选 '' 而不是其他字符做分隔符呢? 这个也容易理解: 一般的编程语言中都用 '' 来作为字符串的结束标志, 文件的路径名中不可能包含 '' 字符.

分享一些find命令与xargs的实例:

删除以html结尾的10天前的文件,包括带空格的文件:
 

find /usr/local/backups -name "*.html" -mtime +10 -print0 |xargs -0 rm -rfvfind /usr/local/backups -mtime +10 -name "*.html" -exec rm -rf {} ;
 
find -print 和 -print0的区别:

-print 在每一个输出后会添加一个回车换行符,而-print0则不会。
当前目录下文件从大到小排序(包括隐藏文件),文件名不为".":
 

find . -maxdepth 1 ! -name "." -print0 | xargs -0 du -b | sort -nr | head -10 | nl
nl:可以为输出列加上编号,与cat -n相似,但空行不编号
以下功能同上,但不包括隐藏文件:
 

for file in *; do du -b "$file"; done|sort -nr|head -10|nlx
args结合sed替换:
 

find . -name "*.txt" -print0 | xargs -0 sed -i 's/aaa/bbb/g'
xargs结合grep:
 

find . -name '*.txt' -type f -print0 |xargs -0 grep -n 'aaa'    #“-n”输出行号


文章来自:http://www.cnblogs.com/jjzd/p/5829558.html


来自  https://blog.csdn.net/u014448841/article/details/76223796




普通分类: