xintop 发表于 2011-09-15 11:44

求高手解答:find后无法直接清空文件内容的问题

当前目录下有很多server开头的目录,如server1,server2,server3...
每个目录中都有一个test.log文件
我希望通过命令把每个目录下的test.log文件清空
于是我用下面的命令,但是都无法清空:
find ./server* -name 'test.log' -exec echo> {} \;
find ./server* -name 'test.log' -exec cat /dev/null> {} \;
find ./server* -name 'test.log' -exec echo "" > {} \;

我执行cat /dev/null> ./server1/test.log,是可以成功清空的,表明exec参数后面的命令没有问题

我执行下面的命令也能成功删除文件,
find ./server* -name 'test.log' -exec rm -rf {} \;

但我想要的是清空文件内容,而不是删除文件,
(请不要告诉我删除文件后创建新文件,那样文件inode就变了)

请真正的高手来解答我的问题,谢谢!!

chenyx 发表于 2011-09-15 13:58

用下面的脚本试试#!/bin/bash
for i in `find ./server* -name "test.log" `
do
cat /dev/null > $i
done

xintop 发表于 2011-09-15 14:06

目前问题已经绕道实现,跟楼上想法一样,暂时也是用for循环处理的:

for i in `find ./server* -name 'test.log'`
do
cat /dev/null > $i;
done;

可惜还是没想明白为啥find的-exec无法清空。。。

taojie2000 发表于 2011-09-15 14:32

回复 1# xintop


    -exec cp /dev/null {} \;

jerryjzm 发表于 2011-09-15 23:07

monitor:/home/monitor/testtest>tree
.
|-- all2.sql
|-- oo2.txt
|-- server1
|   `-- a
|       |-- b
|       |   |-- c
|       |   |   `-- test.log
|       |   `-- test.log
|       `-- test.log
|-- server2
|   `-- test.log
|-- server3
|   |-- dir3
|   |   |-- dir4
|   |   |   `-- test.log
|   |   `-- test.log
|   `-- test.log
`-- {}


monitor:/testtest>find ./server* -name 'test.log' |xargs -i ls -l {} ;
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:55 ./server1/a/test.log
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:55 ./server1/a/b/test.log
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:55 ./server1/a/b/c/test.log
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:56 ./server2/test.log
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:56 ./server3/test.log
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:56 ./server3/dir3/test.log
-rw-r--r-- 1 monitor monitor 1179 Sep 15 22:56 ./server3/dir3/dir4/test.log

monitor:/home/monitor/testtest>find ./server* -name 'test.log'-print|awk '{print "echo > "$0}'
echo > ./server1/a/test.log
echo > ./server1/a/b/test.log
echo > ./server1/a/b/c/test.log
echo > ./server2/test.log
echo > ./server3/test.log
echo > ./server3/dir3/test.log
echo > ./server3/dir3/dir4/test.log
monitor:/home/monitor/testtest>find ./server* -name 'test.log'-print|awk '{print "echo > "$0}'|bash
monitor:/home/monitor/testtest>find ./server* -name 'test.log'-exec ls -l {} \;
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server1/a/test.log
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server1/a/b/test.log
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server1/a/b/c/test.log
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server2/test.log
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server3/test.log
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server3/dir3/test.log
-rw-r--r-- 1 monitor monitor 1 Sep 15 23:15 ./server3/dir3/dir4/test.log

xintop 发表于 2011-09-16 13:54

哦,楼上的 |bash 用的很巧妙,学习了,够强!!:em27:

xintop 发表于 2011-09-16 13:57

哦,楼上的 |bash 用的很巧妙,学习了,够强!!:em27:

licong_jay 发表于 2011-09-16 14:39

5楼强人, 一个awk|bash 与for 循环异曲同工之秒

疑似精神病 发表于 2011-09-16 14:55

licong_jay 发表于 2011-09-16 15:48

回复 9# 疑似精神病


    原来病哥是高手

犯了和我一样的问题,木有考虑子目录
页: [1] 2
查看完整版本: 求高手解答:find后无法直接清空文件内容的问题