千家信息网

linux find的-print0和xargs中-0有什么区别

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,小编给大家分享一下linux find的-print0和xargs中-0有什么区别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一
千家信息网最后更新 2025年12月01日linux find的-print0和xargs中-0有什么区别

小编给大家分享一下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

比如我想把所有的 .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"输出行号

以上是"linux find的-print0和xargs中-0有什么区别"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 输出 字符 代码 换行符 文件名 篇文章 一行 两个 内容 分隔符 空格 不错 强大 相似 聪明 不幸 不怎么 办法 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器的重要性有哪些 如何测试服务器的性能 宽城区网络安全经验丰富 广东特色软件开发市场价 长宁区创新软件开发销售电话 网络安全和信息化建设十三五 福建存储服务器机箱是什么 忘川风华录祖龙吟服务器 怎么查邮件服务器信息 常见保障网络安全的手段 合肥软件开发java培训 玉树网络技术质量 带外服务器 计算机网络安全员面试题 郑州网络安全培训机构简单易学 芜湖软件开发外包公司 科技苑互联网卖土鸡 云南 网络技术公司 滇池 计算机网络技术与应用的指法 人民日报有关网络安全的 软件开发设计阶段有什么 网络安全法包括哪几部分 同时删除数据库 2018年网络安全共计事件 c语言和软件开发有什么关系 联合网络安全培训 网络安全中注入是什么意思 计算机网络技术发展职位 认知无线网络技术应用 梦幻西游浙江二区服务器虚拟主机
0