2014-04-01 107 views
2

我已經編寫了一個腳本來遍歷Solaris中的目錄。該腳本查找超過30分鐘並回顯的文件。但是,無論文件有多大,我的if條件總是返回true。有人請幫助解決這個問題。如何檢查unix中的文件是否超過30分鐘

for f in `ls -1`; 
# Take action on each file. $f store current file name 
do 
    if [ -f "$f" ]; then 
    #Checks if the file is a file not a directory 
    if test 'find "$f" -mmin +30' 
    # Check if the file is older than 30 minutes after modifications 
    then 
    echo $f is older than 30 mins 
    fi 
fi 
done 
+0

'if test'find「$ f」-mmin + 30'' should be'[$(fi nd「$ f」-mmin +30)]' – fedorqui

回答

4
  1. You should not parse the output of ls
  2. 調用find每個文件未必是緩慢

您可以

find . -maxdepth 1 -type f -mmin +30 | while IFS= read -r file; do 
    [ -e "${file}" ] && echo "${file} is older than 30 mins" 
done 

取代你的整個腳本,或者,如果您的默認外殼上Solaris支持進程替換

while IFS= read -r file; do 
    [ -e "${file}" ] && echo "${file} is older than 30 mins" 
done < <(find . -maxdepth 1 -type f -mmin +30) 

如果你有你的系統,整個事情可以在一個線路上做GNU find

find . -maxdepth 1 -type f -mmin +30 -printf "%s is older than 30 mins\n" 
+0

HI艾德里安,當我做第一個選項時,我得到以下錯誤。 'find:bad option -maxdepth find:[-H | -L]路徑列表謂詞列表' 理想情況下,我想將文件移動到另一個目錄。我只是在這裏迴應以測試條件。 – user3484214

+0

啊,所以Solaris的'find'也沒有'-maxdepth'。那麼,你可以使用'find。 ! -名稱 。 -prune -type f -mmin + 30'來模擬它。 –

+0

你也可以通過'find'去掉''''/''兩個以上的斜槓來刪除子目錄中的結果。 -type f -mmin +30 | sed'/[/].*[/]/ d''但如果你有更深層次的文件/目錄,這可能會更慢。 –

0

另一種選擇是使用檢查的時間。像下面的東西應該工作。

for f in * 
# Take action on each file. $f store current file name 
do 
    if [ -f "$f" ]; then 
    #Checks if the file is a file not a directory 
    fileTime=$(stat --printf "%Y" "$f") 
    curTime=$(date +%s) 
    if (((($curTime - $fileTime)/60) < 30)) 
     echo "$f is less than 30 mins old" 
    then 
     echo "$f is older than 30 mins" 
    fi 
    fi 
done 
+0

我同意,不幸的是,'stat'不是可移植的,並且在所有Solaris版本上都不可用(Solaris有自己的'truss'工具),所以這可能不起作用。 –

+0

@AdrianFrühwirth令人失望。只能在這種情況下解析'ls'的時間,儘管我認爲你的解決方案更好。 – BroSlow

1

既然你是通過遍歷目錄,你可以嘗試下面的命令,它會發現在過去的30分鐘編輯日誌類型結尾的文件。使用:

  • -mmin +30會給前30分鐘前編輯的所有文件

  • -mmin -30會給那些在最後30分鐘

 

find ./ -type f -name "*.log" -mmin -30 -exec ls -l {} \; 
內更改過的所有文件
相關問題