find / -name "*.ini" -exec file {} \;
find / -name "*.ini" | xargs -i file {}
find ./ -name '*.txt' -type f -print -exec -maxdepth 2 command {} \;
-name : 匹配的文件名
-maxdepth -mindepth : 指定搜索层上下限
-type : 指定文件类型,可以是b|c|f|d(块设备|终端|文件|目录)等类型
-print -print0 : 打印匹配的文件名,-print0用于特殊文件名的打印
-exec command {} \; : 每找到一个文件,文件名替换到 '{}' 的位置,然后执行 command $filename 。注意-exec选项,在shell中执行时后面要跟一个"\;" (其中'\'表示在shell中对';'的转义),或写成:find . -name '*.txt' -exec command {} ';' 。
xargs -i -n 2 command $args {}
-i,--replace=[R] : 依次从标准输入中读取参数替换到指定字段R,然后执行command。若不指定R,则默认替换位置为'{}'的位置;
-n : 指定每次从输入流读取的参数个数。指定-i,则-n选项失效。若不指定-i和-n,则将所有读取内容填充到$args 位置后面,command只执行依次。
例子:
[root@Ustor orange]# ls
A.txt B.txt C.txt D.txt E.txt
[root@Ustor orange]# find . -name '*.txt' -exec echo {} '##' \;
./A.txt ##
./B.txt ##
./C.txt ##
./D.txt ##
./E.txt ##
[root@Ustor orange]# find . -name '*.txt' -print -exec echo {} '##' ';' ##打印名字再执行命令
./A.txt
./A.txt ##
./B.txt
./B.txt ##
./C.txt
./C.txt ##
./D.txt
./D.txt ##
./E.txt
./E.txt ##
[root@Ustor orange]# find . -name '*.txt' | xargs echo '##' ##全部参数填充
## ./A.txt ./B.txt ./C.txt ./D.txt ./E.txt
[root@Ustor orange]# find . -name '*.txt' | xargs -n 2 echo '##' ##每次最多填充2个
## ./A.txt ./B.txt
## ./C.txt ./D.txt
## ./E.txt
[root@Ustor orange]# find . -name '*.txt' | xargs -n 2 -i echo {} '##' ##使用-i逐次替换,-n失效
./A.txt ##
./B.txt ##
./C.txt ##
./D.txt ##
./E.txt ##
[root@Ustor orange]# find . -name '[AB].txt' | xargs -i cp {} {}.bak ##A,B文件做备份
[root@Ustor orange]# ls
A.txt A.txt.bak B.txt B.txt.bak C.txt D.txt E.txt