linux删除掉ls外的文件,linux中ls与rm删除文件的问题分析

通常ls列出的文件,想直接管道通过rm -rf删除是无效的.这时就要配合命令xargs使用了:

例如:

ls -t|tail -10|xargs rm -rf    //按时间排序,删除最后的10个文件

当然,也可以用ls -lt|tail -100|awk '{ print $9 }'|xargs rm -rf     两者效果是相同的同理,如果想按时间倒序排列,也就是说离现在最近的时间越排在最后显示,就用ls -rt当然,也可以使用find 配合rm删除。

也可以用下面的语句清空内容

#!/bin/bash

for i in `ls test.log.??` ;do

echo "">$i

done

当然,如果是多个目录下面,再清除文件,也是可以的。只不过多了一层嵌套而忆。我的目录结构如下:

[root@web tomcat]# ll

总计 260

drwxr-xr-x 2 www www 20480 12-28 09:23 bbs

drwxr-xr-x 2 www www 16384 12-28 00:00 comment

drwxr-xr-x 2 www www 36864 12-28 03:50 enterprise

drwxr-xr-x 2 www www 24576 12-28 00:00 expert

drwxr-xr-x 2 www www 36864 12-28 00:02 feedback

drwxr-xr-x 2 www www 36864 11-15 12:30 generator

drwxr-xr-x 2 www www 24576 12-28 00:02 passport

drwxr-xr-x 2 www www 20480 12-28 00:00 search

drwxr-xr-x 2 www www 20480 12-28 09:35 usercenter

[root@web comment]# ll

总计 936

-rw-rw-r-- 1 www www       2 12-28 09:57 catalina.2012-12-24.log

-rw-rw-r-- 1 www www       2 12-28 09:57 catalina.2012-12-25.log

-rw-rw-r-- 1 www www       2 12-28 09:57 catalina.2012-12-26.log

-rw-rw-r-- 1 www www       2 12-28 09:57 catalina.2012-12-27.log

-rw-r--r-- 1 www www   34155 12-28 10:01 catalina.out

-rw-rw-r-- 1 www www       2 12-28 09:57 localhost.2012-12-14.log

-rw-rw-r-- 1 www www       2 12-28 09:57 localhost.2012-12-17.log

-rw-rw-r-- 1 www www       2 12-28 09:57 localhost_access_log.2012-12-25.txt

-rw-rw-r-- 1 www www       2 12-28 09:57 localhost_access_log.2012-12-26.txt

-rw-rw-r-- 1 www www  629729 12-28 09:57 localhost_access_log.2012-12-27.txt

如果想清空以上所有目录里的所有文件,就可以这样做:

for i in `ls`;do (cd $i ;for m in `ls`;do echo " ">$m;done);done

注:上面的圆括号是不能少的。

而如果想要清空一个文件的内容,再使用xargs配合echo "">file,发现确不能正常生效。如:

find . -name "test.*" |xargs echo "">

因为,find和echo的不是这样配合使用的。其两者简单配合有另外一个妙用:

find . -name "file*" -print | xargs echo "" > /tmp/find.log

该语句的作用,是将当前目录下,所有以file开头的文件查找到,并将其相对路径及名称输入到find.log文件中,输入方式为每行一个。对符合条件的原文件不会做任何改变。

而如果想实现find查找并清空文件,难道我们就没办法了吗?很显然,这是不可能的。菜鸟们的办法是:

#!/bin/bash

for i in `find ./server* -name "test.log" `

do

cat /dev/null > $i

done

高手显然不屑于使用这么长的语句,高手们的办法是:

[root@localhost log]# find . -name "maillog*" |awk '{ print "echo>"$0}'|bash

或者把索性把echo也去掉

[root@localhost log]# find . -name "maillog*" |awk '{ print ">"$0}'|bash

该语句是如何变化为来的得呢?

[root@localhost log]# find . -name "maillog*"|xargs -i ls -l {}

-rw------- 1 root root 0 11-09 05:06 ./maillog

-rw------- 1 root root 0 11-09 05:06 ./maillog.1

以上为找出所有文件,而再利用强大的awk,可以将所有输出的文件前加 echo ""> 以bash语句的方式出现

[root@localhost log]# find . -name "maillog*"|awk '{print "echo > "$0}'

echo > ./maillog

echo > ./maillog.1

find命令配合rm删除某天前的文件

例1: 将/usr/local/backups目录下所有10天前带"."的文件删除

find /usr/local/backups -mtime +10 -name "*.*" -exec rm -rf {} \;

find:linux的查找命令,用户查找指定条件的文件

/usr/local/backups:想要进行清理的任意目录

-mtime:标准语句写法

+10:查找10天前的文件,这里用数字代表天数,+30表示查找30天前的文件

"*.*":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三

-exec:固定写法

rm -rf:强制删除文件,包括目录

{} \; :固定写法,一对大括号+空格+\

find $1 -name "*.html" -mtime +1 -print0 |xargs -0 rm -v

注:我上面的例子,只是列了一层目录,而find查找时,是会将其下面的子目录内符合条件的语句也会包含进来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值