2015-10-29 5 views
17

最後のx分、たとえば最近1時間に変更されたファイルを検索しようとしています。ネット上の多くのフォーラムやチュートリアルは、このように、-mminオプションを指定してfindコマンドを使用することをお勧め:予想通り最後のx分で修正されたファイルを見つける方法(-mminが期待どおりに動作しない)

find . -mmin -60 |xargs ls -l

しかし、このコマンドは私のために動作しませんでした。あなたは次のリストから見ることができるように、それはまた、以前よりも1時間前に変更されたファイルを示しています

-rw------- 1 user user 9065 Oct 28 23:13 1446070435.V902I67a5567M283852.harvester 
-rw------- 1 user user 1331 Oct 29 01:10 1446077402.V902I67a5b34M538793.harvester 
-rw------- 1 user user 1615 Oct 29 01:36 1446078983.V902I67a5b35M267251.harvester 
-rw------- 1 user user 72365 Oct 29 02:27 1446082022.V902I67a5b36M873811.harvester 
-rw------- 1 user user 69102 Oct 29 02:27 1446082024.V902I67a5b37M142247.harvester 
-rw------- 1 user user 2611 Oct 29 02:34 1446082482.V902I67a5b38M258101.harvester 
-rw------- 1 user user 2612 Oct 29 02:34 1446082485.V902I67a5b39M607107.harvester 
-rw------- 1 user user 2600 Oct 29 02:34 1446082488.V902I67a5b3aM465574.harvester 
-rw------- 1 user user 10779 Oct 29 03:27 1446085622.V902I67a5b3bM110329.harvester 
-rw------- 1 user user 5836 Oct 29 03:27 1446085623.V902I67a5b3cM254104.harvester 
-rw------- 1 user user 8970 Oct 29 04:27 1446089232.V902I67a5b3dM936339.harvester 
-rw------- 1 user user 165393 Oct 29 06:10 1446095400.V902I67a5b3eM290158.harvester 
-rw------- 1 user user 105054 Oct 29 06:10 1446095430.V902I67a5b3fM265065.harvester 
-rw------- 1 user user 1615 Oct 29 06:24 1446096244.V902I67a5b40M55701.harvester 
-rw------- 1 user user 1620 Oct 29 06:24 1446096292.V902I67a5b41M337769.harvester 
-rw------- 1 user user 10436 Oct 29 06:36 1446096973.V902I67a5b42M707215.harvester 
-rw------- 1 user user 7150 Oct 29 06:36 1446097019.V902I67a5b43M415731.harvester 
-rw------- 1 user user 4357 Oct 29 06:39 1446097194.V902I67a5b56M446687.harvester 
-rw------- 1 user user 4283 Oct 29 06:39 1446097195.V902I67a5b57M957052.harvester 
-rw------- 1 user user 4393 Oct 29 06:39 1446097197.V902I67a5b58M774506.harvester 
-rw------- 1 user user 4264 Oct 29 06:39 1446097198.V902I67a5b59M532213.harvester 
-rw------- 1 user user 4272 Oct 29 06:40 1446097201.V902I67a5b5aM534679.harvester 
-rw------- 1 user user 4274 Oct 29 06:40 1446097228.V902I67a5b5dM363553.harvester 
-rw------- 1 user user 20905 Oct 29 06:44 1446097455.V902I67a5b5eM918314.harvester 

実は、それだけで現在のディレクトリ内のすべてのファイルをリストされています。私たちは、一例として、これらのファイルのいずれかを取ると、lsコマンドで表示されるように、その修正時刻が本当にあるかどうかを確認することができます

stat 1446070435.V902I67a5567M283852.harvester 

    File: ‘1446070435.V902I67a5567M283852.harvester’ 
    Size: 9065  Blocks: 24   IO Block: 4096 regular file 
Device: 902h/2306d Inode: 108680551 Links: 1 
Access: (0600/-rw-------) Uid: (1001/ user) Gid: (1027/ user) 
Access: 2015-10-28 23:13:55.281515368 +0100 
Modify: 2015-10-28 23:13:55.281515368 +0100 
Change: 2015-10-28 23:13:55.313515539 +0100 

は、我々が見ることができるように、このファイルは間違いなく最後早くより1時間前に変更されました!私もfind -mmin 60またはfind -mmin +60を試しましたが、うまくいきませんでした。

なぜこの問題が発生し、findコマンドを正しく使用するのですか?

答えて

30

ファイルにというファイルが1時間以内に変更されていない場合は、問題を再現できます。その場合、find . -mmin -60は何も返しません。ただし、コマンドfind . -mmin -60 |xargs ls -lは、ディレクトリ内のすべてのファイルを返します。これは、引数なしでls -lが実行されたときの動作と一致します。ファイルが発見された場合ls -lだけしようと、実行されていることを確認する

find . -mmin -60 -type f -exec ls -l {} + 
+1

Ummm..clever .. + 1 – heemayl

+0

また、入力がない場合は実行されているから、それを防ぐために、xargsのに-rフラグを使用することができます。もちろん、xargsの使用時にファイル名のスペースが問題を起こさないようにすることを強く推奨します。例: 'find。 -mmin 60 -print0 | xargs -0r ls -l'です。改行は通常、アクティブな攻撃者を除いてかなり安全です 'find。 -mmin 60 | xargs '-rd \ n' ls -l'もちろん、上記の答えの-execの代替は、両方の問題を解決します。 –

-1

このコマンドは先生を助けることもできる

find -type f -mtime -60 
+0

find -type f -mtime -90 –

+0

これは分ではなく60 ** days **より古いファイルを検索します。 – MSalters

2

発見のマニュアル:

Numeric arguments can be specified as 

    +n  for greater than n, 

    -n  for less than n, 

    n  for exactly n. 

    -amin n 
      File was last accessed n minutes ago. 

    -anewer file 
      File was last accessed more recently than file was modified. If file is a symbolic link and the -H option or the -L option is in effect, the access time of the file it points to is always 
      used. 

    -atime n 
      File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to 
      have been accessed at least two days ago. 

    -cmin n 
      File's status was last changed n minutes ago. 

    -cnewer file 
      File's status was last changed more recently than file was modified. If file is a symbolic link and the -H option or the -L option is in effect, the status-change time of the file it points 
      to is always used. 

    -ctime n 
      File's status was last changed n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file status change times. 

例:

find /dir -cmin -60 # creation time 
find /dir -mmin -60 # modification time 
find /dir -amin -60 # access time 
0

これはあなたのために働くかもしれません。私は古い配備ファイルを削除する配備中にフォルダをクリーンアップするのに使った。

clean_anyfolder() { 
    local temp2="$1/**"; //PATH 
    temp3=($(ls -d $temp2 -t | grep "`date | awk '{print $2" "$3}'`")) 
    j=0; 
    while [ $j -lt ${#temp3[@]} ] 
    do 
      echo "to be removed ${temp3[$j]}" 
      delete_file_or_folder ${temp3[$j]} 0 //DELETE HERE 
     fi 
     j=`expr $j + 1` 
    done 
} 
8

問題は、

find . -mmin -60 

出力:

. 
./file1 
./file2 

注1つのドットとライン?
これにより、ディレクトリは、ls -l .が実行されたときとまったく同じディレクトリになります。

find . -mmin -60 -type f | xargs ls -l 

しかし、オプション検索の-exec直接使用することをお勧めし:

find . -mmin -60 -type f -exec ls -l {} \; 

それとも:

一つの解決策は、ファイルのみ(いないディレクトリ)をリストすることです

ディレクトリを含めても安全です。

find . -mmin -60 -ls 
+0

ありがとう!このドットはまさに問題の根源でした! – hashbang

+0

@hashbang感謝の常套手段は答えをアップすることです。必要に応じて、答えの左にある投票数の上にある上矢印をクリックします。 –

0

実際、ここには複数の問題があります。主なものは、引数が渡されていなくても、指定したコマンドをデフォルトで実行するということです(xargs)。あなたはxargsにGNUの拡張機能を使用する可能性のある変更するには:標準入力は任意のデータ有りが含まれていない場合

実行--no--IF-空
-r
、コマンドを実行しないでください。通常、コマンドが入力されなくても一度実行されます。このオプションはGNU拡張です。

簡単な例:

find . -mmin -60 | xargs -r ls -l 

しかし、これは.(カレントディレクトリ)を含むすべてのサブディレクトリに一致するかもしれない、とlsは、それらのそれぞれを個別に一覧表示されます。だから出力は混乱するでしょう。解決策:ディレクトリの内容を一覧表示禁止され、ls-dを渡す:

find . -mmin -60 | xargs -r ls -ld 

今、あなたはあなたのリストの中.(カレントディレクトリ)を好きではないのですか?ソリューション:今、あなたはあなたのリストにあるファイルのみを必要とするだろう

find . -mindepth 1 -mmin -60 | xargs -r ls -ld 

:検索出力からの最初のディレクトリレベルを(0)除外?解決策:ディレクトリを除外:

find . -type f -mmin -60 | xargs -r ls -l 

は今、あなたはホワイトスペース、引用符、またはバックスラッシュを含む名前のいくつかのファイルがありますか?解決策:使用のNULL終了出力(見つける)と入力(xargsの)(これらは、私の知る限り、また、GNU拡張です):

find . -type f -mmin -60 -print0 | xargs -r0 ls -l 
2

私は同じ必要性を通じて働いていると私はあなたの時間枠が間違っていると信じています。

これらを試してみてください。

  • 15分の変更:見つけます。 -mtime -.01
  • 1時間ごとの変更:検索。 -mtime -.04
  • 12時間変更:find。 -mtime -.5

あなたのベースは24時間です。 -mtimeの後の数字は24時間に相対的でなければなりません。したがって、-5は12時間に相当し、12時間は24時間の半分であるためです。更新とは逆の順序でソートされた最も最近変更されたファイルを検索するに

$ find /target_directory -type f -mmin -60 

、:最後の60分に変更されている中/ target_directoryファイルとそのすべてのサブディレクトリを検索するには

0

時間(すなわち、最も最近更新されたファイル最初):

$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r 
関連する問題