今日に属さないログファイルで、ファイル名に2015
が含まれるものだけをリストアップしたい。
以下は、私が試したコマンドです。
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
両方からの出力は何もありませんが、それでも、ファイルはそこにあります。これらのコマンドは何かが間違っており、私は何を得ることができません。どんな助けでも感謝します。
コマンド `find .-name '2015' -mmin +1440 -lsというコマンドは、おそらくあなたが望むことを行うでしょう。詳細は以下を参照してください。 最初のコマンドは
-name 2015` でしたね。これは、他の文字を含まない、名前が 正確に 2015
であるファイルだけを 探すので、うまくいきませんでした。
2番目のコマンド、`find .-name 2015 -mtime +1 -exec ls -ltrh {} というコマンドです。\というコマンドは、いくつかの理由で失敗した可能性があります。
*
文字はシェルによって展開され、その後 find
に渡されます。もし、現在のディレクトリ(find ...コマンドを実行したときのディレクトリ)にあるファイルで、名前が
2015(かつ
.で始まらない)を含むものがあれば、シェルは
2015をそれらのファイル名のリストに展開し、そのリストを
findに引数として渡します。シェルではなく
findがそれにマッチするファイルを見つけられるように、
2015を文字通り find の引数として渡したいのです。 この問題を解決するには、
2015` を引用符で囲みます。この方法には3つの一般的な方法があります。
"*2015*"
(すなわち、find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
).*2015***
(i.e., find . -name \*2015*** -mtime +1 -exec ls -ltrh {} \;
)
これを '*2015*'
とシングルクォートで記述することをお勧めします1。ament
でクォートする と、シェルから find
コマンドに何が渡されたかを正確に確認することが難しくなります。"
による引用]4は、時にやや複雑なルールを伴います。
しかし、この場合、それはあまり重要ではありません。'
と "
はどちらも *
を同じように扱いますし、quoting
が理解できないほど式は複雑ではありません。man find`]6 が言うように。
数値引数は以下のように指定することができます。
<em>+n</em> for greater than <em>n</em>,
<em>-n</em> for less than <em>n</em>,
<em>n</em> for exactly <em>n</em>.
-mtime n
ファイル'のデータは、n*24時間前に最終更新されました。 コメント欄参照
のコメントを参照してください。
のコメントを参照してください。
-atime n
ファイルの最終アクセスは n*24 時間前です。 findが計算するとき
何時間前にファイルが最後にアクセスされたかを調べるとき、端数は無視されます。
そのため、 -atime +1 にマッチするためには、ファイルは少なくとも以下の時間前にアクセスされていなければなりません。
には、少なくとも2日前にアクセスされている必要があります。
あるファイルが47時間前に変更されたとします。それが何時間前なのかを知るために、`find`は*切り捨て*をします:それは*1*24時間前です。しかし、 `-mtime +1` は、変更時刻が *厳密に* 1つ以上* 24時間前のファイルにのみマッチします。したがって、昨日のファイルにはマッチしません。
詳しくは [Why does find -mtime +1 only return files older than 2 days?][7] と [suggested by steeldriver][8] を参照してください。
最終更新時刻が24時間以上前のファイル**を探すには、代わりに `-mmin +1440` で [1440分前][9] と規定することをお勧めします。
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
読者の中には、なぜ {}
を引用しなかったのか不思議に思う人もいるかもしれません。ある人は {}
が brace expansion のための表現ではないことを人間に思い知らせるために引用しているのです。Bourneスタイルのシェル (例えば bash) では、何も入っていない {}
を引用する必要は don't ないのです。もしかしたら、Bourne 系以外のシェルでは特別に扱われるかもしれません。しかし、exec
がスペースを含むファイル名を正しく処理するために、 {}
を引用しなければならないことがあるという誤解もあるようです。これは間違いです。{}
や '{}'
を使っても、find
は同じ*引数を取得します。なぜなら、シェルは '{}'
に渡す前にクォートを削除するからです。この誤解を解くために、私は{}
を引用していませんが、これはスタイルの問題です。もし、{}
がシェルが{
と}
を特別扱いしないことを示すのに適しているなら、それは構わないでしょう。
また、ls
コマンドを変更するか、(muruが提案したように) find
's -ls
アクションに置き換えることをお勧めします。**なぜなら、見つかったファイルごとに別々に実行されるため、ソートを指定する -t
と -r
フラグは関係ないからです。
出力は ls -l
とは少し違うフォーマットになりますが、 -ls
を使う方がシンプルで簡単です。
find . -name '*2015*' -mmin +1440 -ls
また、ファイル名(パスを含む、.
からの相対パス)をリストアップするだけなら、no actionを指定すれば、デフォルトの -print
アクションが使用されます。
find . -name '*2015*' -mmin +1440
zsh](http://packages.ubuntu.com/) では glob qualifiers が使えます (これは zsh 独自の機能で、bash などの他のシェルでは使えません)。
ls -ltr *2015*(m+1)
これは現在のディレクトリにあるファイルのみをリストアップします。ディレクトリを再帰的にたどる には、次のようにします。
ls -ltr **/*2015*(m+1)
name 2015は
findと一緒に使うと、名前がちょうど
2015であるファイルだけを見つけることができます。name *2015*
は、カレントディレクトリに 2015
を名前に含むファイルがない場合にのみ動作します。これは、 find
が実行される前に、シェルが *2015*
というパターンを展開するからです。パターンを引用符で囲む必要があります。
find -name '*2015*' -mtime +1 …
find -mtime +1と zsh's
*(m+1)の両方が、今日より古いファイルではなく、**少なくとも48時間** 古いファイルを見つけるということに注意してください。プラス記号は「厳密にそれ以上」を意味し、日数は切り捨てられます。少なくとも24時間以上前のファイルを見つけるには、
-mtime +0または
(m+0)` を使ってください。
もし、最終更新日が 昨日以前 のファイルを見つけたい場合は、 find
に -newermt
述語 を付けて使用することができます。
find -name '*2015*' ! -newermt 'today 0:00' …
zshでこのテストを行うための便利な方法はありません。