[实践OK]Linux下使用find命令使用-exec 进行两次大括号传入路径进行cat重定向到对应的特定文件,清空日志目录日志。

jackxiang 2017-6-24 13:06 | |
[实践OK]Linux下使用find命令使用-exec 进行两次大括号传入路径进行cat重定向到对应的特定文件可结合xargs 相关命令:http://jackxiang.com/post/6520/
find超级查找,路径模糊、文件名模糊、时间、大小:

看文件名:https://linux.cn/article-6956-1.html ,使用 -l 选项可以只显示文件名。 ll  |grep ^d 只显示目录。
查找所有Conf文件包含了upstream的时间变量的文件列出来:

./nginx.conf

#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo '' > {}" \;


=============================================
这个解决方法我可是找了好久。。。正确写法:


find -name "*" -exec sh -c 'cat {} > {}.out.iso' \;
find -name "*.php" -exec bash -c "mv -f {} {}.tmp" \;
find -name "*.php" -exec bash -c "copy {} {}.tmp" \;
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;

替换文件名内容:

find /tmp/exectest  -name "*.txt" -exec bash -c "ls {}" \;                    
/tmp/exectest/b.txt
/tmp/exectest/aaa/ccc.txt

find /tmp/exectest  -name "*.txt" -exec bash -c "ls {}|sed -e 's/txt/php/'" \;        
/tmp/exectest/b.php
/tmp/exectest/aaa/ddd.php






批量给不同层次的目录包含的*.log里写入jackwriteLog或清空日志:
find -name "*.log" -exec bash -c "echo '' > {}" \;
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
修改为这样:
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;



# find -name "*.log" -exec bash -c "echo 'jackwriteLog' > {}" \;        
# cat  ./k.log
jackwriteLog
# cat  ./n/n.log
jackwriteLog
# cat  ./n/j/a.log
jackwriteLog


find -name "*.php" -exec bash -c "cp {} {}.tmp" \;  
a.php  a.php.tmp  b.php  b.php.tmp



@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
      -i[SUFFIX], --in-place[=SUFFIX]
              edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容

======以前的分割线======

要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect

搜到了这一页: http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。

解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;

哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;

嘿,这下爽了!
From:https://www.felix021.com/blog/read.php?1465




像下面这些文章只是说这么用,但从不说为何,在QQ群里说只一句重定向,没一个解释更深入点的,附录:
如何在-exec参数中使用重定向
http://www.2cto.com/os/201306/222794.html

Clear log file content without impacting service that is running (in batch):

find . -name "*.log" -exec bash -c ">{}" \;

Subsitute file content in batch:

find -name "*.xml" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;

http://blog.csdn.net/duanlove/article/details/8261677

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/9275/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2018-1-30 10:16
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]