在linux中ls與rm命令都比較常用了,今天小編在使用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 --Vevb.com
- -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查找時,是會將其下面的子目錄內符合條件的語句也會包含進來.
新聞熱點
疑難解答