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.jbxue.com/LINUXjishu/24429.html

时间: 2024-08-28 18:17:55

linux find命令-print0和xargs中-0使用技巧(转载)的相关文章

find中的-print0和xargs中-0的奥妙【转】

find cygnus/firmware_cygnus/target/linux/brcm5830/files/arch/arm/mach-iproc/pm_iproc/ -name "*.c" -print | xargs grep "USB" 原文地址:find中的-print0和xargs中-0的奥妙作者:改变自己 默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此我们看到的 find 的输出都是一行一行的: [bash

find中的-print0和xargs中-0的奥妙

原文地址: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

[zz]linux find命令中-print0和xargs中-0的用法

  默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('n'), 因此find 的输出都是一行一行的: [bash-4.1.5] ls -ltotal 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 比如用f

Linux将命令添加到PATH中

Linux将命令添加到PATH中博客分类:linuxLinuxApacheBash 简单说PATH就是一组路径的字符串变量,当你输入的命令不带任何路径时,LINUX会在PATH记录的路径中查找该命令.有的话则执行,不存在则提示命令找不到.比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls命令根本不在这个两个目录下,当你输入ls命令时LINUX会去/bin,/usr/bin,/sbin等目录寻找该命令.而PATH就是定义/bin:/sbin:/usr/bin等这些路劲的变

linux常用命令(19)find xargs

在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误.错误信息通常是"参数列太长"或"参数列溢出".这就是xargs命令的用处所在,特别是与find命令一起使用. find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样.这样它可以先处理最先获取的一

【Linux】命令写在文件中并调用awk -f

我们在使用awk命令的时候,有时候命令特别长,在终端写出来格式太乱,难以阅读,以下是一个将命令写在文件中,并使用awk调用的具体案例 1.现在有文件file3.txt,内容如下: 2.ak2.awk脚本 #打印标题并格式化打印出数量合计 BEGIN { FS="\t" #设置字段分割符 printf("%10s %2s %5s %s\n\n", "Fruits","Num","Price","Pl

Linux将命令添加到PATH中【转】

转自:http://www.jb51.net/LINUXjishu/150167.html 电脑中必不可少的就是操作系统.而Linux的发展非常迅速,有赶超微软的趋势.这里介绍Linux的知识,让你学好应用Linux系统.比如要把/etc/apache/bin目录添加到PATH中,方法有三: 1.#PATH=$PATH:/etc/apache/bin 使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH 设置就会失效 2.#vi /etc/profile 在适当位置添加 PA

linux常用命令之安装VMware10中安装CentOS 6.4

笔者用过的Linux系统也就是现在主流的企业级linu系统RedHat跟CentOS,这边主要介绍下CentOS 6.4的安装 RedHat和CentOS差别不大,CentOS是一个基于RedHat Linux 提供的可自由使用源代码的企业级Linux发行版本 CentOS独有的yum命令支持在线升级,可以即时更新系统,不像RED HAT那样需要花钱购买支持服务! 首先安装VMware Workstation这边就不多介绍了,可自行google或者度娘! 下面开始介绍安装过程 第一步,文件 →

linux常用命令收集(持续中)

mv  :  既可以重命名,又可以移动文件或文件夹 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式中要重命名文件或目录的话也是很简单的,我们只需要使用mv命令就可以了,比如说我们要将一个名为abc的文件重命名为1234就可以这样来写:mv abc 1234,但是要注意的是,如果当前目录下也有个1234的文件的话,我们的这个文件是会将它覆盖的 详细介绍 http://www.cnblogs.com/peida/archive