ファイル名に「2015」が含まれる1日より古いファイルを一覧表示する方法は?


11

今日に属していないすべてのログファイルと2015、名前に含まれているファイルのみを一覧表示します。

これらは私が試したコマンドです:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

両方からの出力は何もありませんが、それでもファイルは存在します。これらのコマンドに問題があり、何を取得できません。任意の助けいただければ幸いです。


find一部は私には良いように見えますが、私はまた、との問題だった-execのパラメータを。それもうまくいきませんでした。(私はすべてのjpgファイルを1つのフォルダーからそれを介してその親ディレクトリに移動しようとしました-そして手動でそれを行ってしまいました...)
バイトコマンダー


@steeldriver現在のディレクトリに2015名前が含まれているファイルがある場合(コマンドの記述方法の他の明らかな欠点)、ある種の出力があるのではないと思います。だからあなたはそれについて答えを投稿したいかもしれません。
Eliah Kagan

回答:


18

コマンドfind . -name '*2015*' -mmin +1440 -lsはおそらくあなたが望むことをするでしょう。詳細については、以下を参照してください。

最初のコマンドは-name 2015でした。名前が正確にで、他の文字が含まれていないファイルのみを検出するため、機能しませんでした。 2015

2番目のコマンドはfind . -name *2015* -mtime +1 -exec ls -ltrh {} \;、いくつかの理由で失敗した可能性があります。

1.引用符で囲まれていない*文字はシェルによって展開され、渡されfindます。

現在のディレクトリに直接含まれているファイル(そのfind ...コマンドを実行したときのファイル)に名前が含まれている2015(そしてで始まっていない.)ファイルがある場合、シェル*2015*はそれらのファイル名のリストに展開され、次に渡されます。そのリストをへの引数としてfind。これはあなたが望むものではありません-その代わりに、*2015*検索するための引数として文字通りに渡したいのでfind、シェルではなく、がそれに一致するファイルを見つけることができます。

その問題を修正するには、を引用してください*2015*。これを行うには、3つの一般的な方法があります。

  • '*2015*'(つまりfind . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
  • "*2015*"(つまりfind . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
  • \*2015\*(つまりfind . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;

次の理由により、一重引用符でとして記述することをお勧めします'*2015*'

しかし、この場合、それは本当に重要ではありません。'そして"両方の御馳走*同じと表現のために十分に複雑ではありません\、それはハードに理解できるようにすること引用します。

2. -mtime +1唯一の選択ファイルが変更さ二つ以上の日前に。

man findこう述べています。

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -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.

ファイルが47時間前に変更されたとします。つまり、24時間の期間の数をfind切り上げるために切り捨てます。これは 24時間前の1つです。ただし-mtime +1、変更時刻が24時間前よりも厳密に 1つ以上長いファイルにのみ一致します。したがって、昨日のファイルは一致しません。

find -mtime +1が2日より古いファイルのみを返すのはなぜですか?を参照してください詳細については、steeldriverによって提案されています

24時間以上前にいつでも最後に変更されたファイルを見つけるには、代わりに1440分前-mmin +1440次のように指定することをお勧めします。

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

一部の読者は、なぜ私が引用しなかったのか疑問に思うかもしれません{}。一部の人々{}は、それがブレース拡張の表現ではないことを人間に思い出させるために引用します。Bourneスタイルのシェルbashなど{}、引用符で囲まれている必要ありません。たぶん、いくつかの非Bourneスタイルのシェルはそれを特別に扱います。これが、一部のユーザーが引用している理由かもしれません。しかし、スペースを含むファイル名を正しく処理するために引用符を付ける必要があるという誤解もあります。それ; sの偽:とや、取得同じシェルのように、引数を引用符を削除渡す前に{}-exec{}'{}'find'{}'find。この誤解に対抗するために、私はを引用しません{}が、それはスタイルの問題です。{}シェルがどのように処理されていないかを文書化したい場合は{}特に問題ありません。

lsコマンドを変更するか、(muruが提案したように)コマンドをfind-lsアクションに置き換えることもお勧めします。ls -ltrh、見つかったファイルごとに個別に実行されるため、おそらく意図したとおりに動作していないため、並べ替えを指定する-tおよび-rフラグは関係ありません。

出力のフォーマットはとは少し異なりますがls -l、使用する方-lsが簡単で簡単です。

find . -name '*2015*' -mmin +1440 -ls

または、本当にファイルの名前(を基準としたパスを含む)のみをリストする必要があると判断した場合は.、アクションを指定せずに、デフォルトの-printアクションを使用することができます。

find . -name '*2015*' -mmin +1440

1
いい答えですね!少なくとも、GNUの検索でもありますnewerXYカレンダーの引数など受け入れ構文、-newermt 'yesterday'および! -newermt 'yesterday'
steeldriver

あのね ?。あなたが素晴らしいです@ Eliahカガン
rɑːdʒɑ

知っておくべきリンクからの非常に良い情報であるstellドライバーに感謝します。しかし、私の場合、アプリケーションの古いファイルからのアプリケーションログが変更される方法がありませんでした。ありがとうございました
rɑːdʒɑ

2

式を引用し、角かっこも引用することをお勧めします

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

または

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

見つけたファイルをlsに渡す必要はありません

find . -name "*2015*" -mtime +1

たぶん使用を制限する-type f?また、ls使用する必要がある場合は、の使用を提案してください-ls
muru、2015

1
確かに、すべての良い提案。OPが何を望んでいるかはわかりません。問題の原因は、「-name」検索パターンの前後に引用符がないことだと思います。
パンサー

2

zshは、使用することができますグロブ修飾子を(たとえばbashのようなその他のシェルでは使用できません、これはユニークなzshの機能です)。

ls -ltr *2015*(m+1)

これは、現在のディレクトリ内のファイルのみをリストします。ディレクトリを再帰的トラバースするには、次を使用します

ls -ltr **/*2015*(m+1)

find-name 2015唯一の名前が正確であるファイルを検索します2015。シェルが呼び出される前にパターンを展開するため、現在のディレクトリに-name *2015*名前が含ま2015れるファイルがない場合にのみ機能します。パターンを引用する必要があります:*2015*find

find -name '*2015*' -mtime +1 …

find -mtime +1とzsh はどちらも、現在よりも古いファイルではなく、少なくとも48時間前の*(m+1)ファイルを見つけることに注意してください。プラス記号は「厳密に超える」ことを意味し、日数は切り捨てられます。24時間以上経過したファイルを検索するには、またはを使用します。-mtime +0(m+0)

昨日またはそれ以前に最後に変更されたファイルを検索する場合findは、-newermt述語とともに使用できます。

find -name '*2015*' ! -newermt 'today 0:00' …

このテストをzshで行うための本当に便利な方法はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.