作者 主題: Linux find 指令問題  (閱讀 5327 次)

0 會員 與 1 訪客 正在閱讀本文。

sidney

  • 憂鬱的高中生
  • ***
  • 文章數: 122
    • 檢視個人資料
Linux find 指令問題
« 於: 2010-03-03 14:04 »
請問一下,我把以下的指令寫成一script,透過script下來執行,
我要刪除50天以前的資料,不過把所有要刪除的指令寫在同一個檔案,會刪除所有的檔案,
並不是把50天前刪掉而以。這算是Linux的Bug嗎?

謝謝!

###start script_delete.sh
find /T2/cell/psheight -mtime +50 -type f -name "*" -exec rm -f {} \;
find /T2/cell/sealinsp -mtime +50 -type f -name "*" -exec rm -f {} \;
find /T2/cell/cellsorter -mtime +50 -type f -name "*" -exec rm -f {} \;

###end

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #1 於: 2010-03-03 14:09 »
請問一下,我把以下的指令寫成一script,透過script下來執行,
我要刪除50天以前的資料,不過把所有要刪除的指令寫在同一個檔案,會刪除所有的檔案,
並不是把50天前刪掉而以。這算是Linux的Bug嗎?
###start script_delete.sh
find /T2/cell/psheight -mtime +50 -type f -name "*" -exec rm -f {} \;
find /T2/cell/sealinsp -mtime +50 -type f -name "*" -exec rm -f {} \;
find /T2/cell/cellsorter -mtime +50 -type f -name "*" -exec rm -f {} \;
###end

建議:
1. 先把 exec rm 改成 exec echo 看看結果.
2. 把 {} 包成 "{}" 看看.
冷笑話: 我的 IP 是 127.0.0.1

sidney

  • 憂鬱的高中生
  • ***
  • 文章數: 122
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #2 於: 2010-03-03 14:53 »
這個我測試過,不過都是正常的資料耶…

因為我的資料量蠻大的,我是在猜想,是不是所有的資料都進到memory中,所以才會刪除到所有的資料?

謝謝!

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #3 於: 2010-03-03 15:09 »
這個我測試過,不過都是正常的資料耶…
因為我的資料量蠻大的,我是在猜想,是不是所有的資料都進到memory中,所以才會刪除到所有的資料?

以個人經驗, Linux 這方面的問題只有兩個:
1. 不確定您描述的"正常的資料"是怎樣的情況, 不過如果查詢結果的清單不如預期, 表示 find 語法要調整.
2. 對特殊字元有些會需要加上跳脫字元.

冷笑話: 我的 IP 是 127.0.0.1

rainday

  • 鑽研的研究生
  • *****
  • 文章數: 738
  • 性別: 男
  • enhancing and optimizing
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #4 於: 2010-03-04 01:23 »
剛好最近有試過find多條件過濾
-f 己經會找出所有的file,所以不用再特別加-name "*"
-o 是or
-path 是File  name  matches shell pattern pattern.
加上上次kenduest學長所教的避免檔名有特殊與空白字元
可以這樣加
find /T2/cell/ -path *psheight*" -o -path "*sealinsp*" -o -path "*cellsorter*"  -mtime +50 -type f -print0 | xargs -0 rm -f {}
試試吧
<0  =_=  Don't learn to hack , hack to learn.

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: Linux find 指令問題
« 回覆 #5 於: 2010-03-04 02:03 »
代碼: [選擇]
find /T2/cell/ -path *psheight*" -o -path "*sealinsp*" -o -path "*cellsorter*"  -mtime +50 -type f -print0 | xargs -0 rm -f {}

其實目前 findutils 的 find 已經支援 -delete 參數,支援的話請使用這參數會有比較好的效率。

ex:

代碼: [選擇]
find /path -type f -delete
I am kenduest - 小州

my website: http://kenduest.sayya.org/

sidney

  • 憂鬱的高中生
  • ***
  • 文章數: 122
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #6 於: 2010-03-08 14:14 »
感謝各位的指教。
我的是suse 9,經查詢有findutils,不過還是要下delete指令才可刪除。
t2fnfs01-adm:/T2/cim/log/20100302 # rpm -qa | grep find
findutils-4.1.7-860.1

下面的指令在我的系統中無法執行…

find /T2/cell/ -path *psheight*" -o -path "*sealinsp*" -o -path "*cellsorter*"  -mtime +50 -type f -print0 | xargs -0 rm -f {}

PS.我當然先用其他的路徑來測試,刪除小於150天的資料,不過資料一筆都沒有少…

find /log/ -path "20100302" -mtime -150 -type f -print0 |xargs -0 rm -f {};

我在測試我的find指令後,有時候空目錄也會把它刪除耶!這個就有點奇怪!
照理說,使用find,空目錄是要留著才對!

舉一個列子:
/tmp/abc/1
/tmp/abc/2
/tmp/abc/3
/tmp/def/1
/tmp/def/2
/tmp/def/3


我要刪除/tmp/底下大於10天的資料,abc底下目錄的資料"有時候"會被全部刪除,目錄留著,且時間改成刪除的時間(正常是不會改目錄的時間),有時候就正常…
這是我頭痛的地方
我要刪除/tmp/底下大於10天的資料,def則正常刪除10天以上的資料,且空目錄會留著(有時候正常狀況).



slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #7 於: 2010-03-08 14:31 »
建議分次試試看:

基本查詢:
代碼: [選擇]
find /log/ -mtime -150 -type f
顯示查詢結果:
代碼: [選擇]
find /log/ -mtime -150 -type f -exec echo "{}" \;
增加條件:
代碼: [選擇]
find /log/ -path "20091231" -mtime -150 -type f -exec echo "{}" \;
確定查詢結果如預期, 再把 echo 改成 rm .

另外 xargs 最好配合 -l 使用, 否則會把其他程式的結果當成一大串文字, 而遇到空白等情況會很難確定結果.
冷笑話: 我的 IP 是 127.0.0.1

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
回覆: Linux find 指令問題
« 回覆 #8 於: 2010-03-08 20:40 »
suse 9 雖也是 linux
但畢竟環境不同會有些微差異 ...
從上述至少看出該環境中 ,  rm -f 不加 r 便可刪除資料夾
find 不支援 -o 也不需意外了
.. 至於為什麼 find -type f , 卻連資料夾都有才是問題


您倒還知道要測試才拿來用 ...


代碼: [選擇]
for onepath in psheight sealinsp cellsorter ;do

  find /log/$onepath -mtime +150 -type f -exec echo rm -f {} \; >> /tmp/find_$onepath_data

  find /log/$onepath -mtime +150 -type f | xargs -0 echo rm -f {} \; >> /tmp/xargs0_$onepath_data

  ###

  diff /tmp/find_$onepath_data /tmp/xargs0_$onepath_data

  cat /tmp/find_$onepath_data /tmp/xargs0_$onepath_data | awk '{if(NF!=3)print $0}'

done