kzen.dev
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 rɑːdʒɑ
rɑːdʒɑ
質問

ファイル名に "2015" が含まれる、1日以上前のファイルを一覧表示する方法は?

今日に属さないログファイルで、ファイル名に2015が含まれるものだけをリストアップしたい。

以下は、私が試したコマンドです。

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

両方からの出力は何もありませんが、それでも、ファイルはそこにあります。これらのコマンドは何かが間違っており、私は何を得ることができません。どんな助けでも感謝します。

10 2015-04-08T01:11:21+00:00 3
Eliah Kagan
Eliah Kagan
編集された質問 8日 4月 2015 в 3:37
Ubuntu
command-line
find
解決策・回答
Eliah Kagan
Eliah Kagan
8日 4月 2015 в 3:33
2015-04-08T03:33:21+00:00
さらに
ソース
編集
#38378070

コマンド `find .-name '2015' -mmin +1440 -lsというコマンドは、おそらくあなたが望むことを行うでしょう。詳細は以下を参照してください。 最初のコマンドは-name 2015` でしたね。これは、他の文字を含まない、名前が 正確に 2015 であるファイルだけを 探すので、うまくいきませんでした。 2番目のコマンド、`find .-name 2015 -mtime +1 -exec ls -ltrh {} というコマンドです。\というコマンドは、いくつかの理由で失敗した可能性があります。

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

もし、現在のディレクトリ(find ...コマンドを実行したときのディレクトリ)にあるファイルで、名前が2015(かつ.で始まらない)を含むものがあれば、シェルは2015をそれらのファイル名のリストに展開し、そのリストをfindに引数として渡します。シェルではなくfindがそれにマッチするファイルを見つけられるように、2015を文字通り find の引数として渡したいのです。 この問題を解決するには、2015` を引用符で囲みます。この方法には3つの一般的な方法があります。

  • find . -name '2015' -mtime +1 -exec ls -ltrh {} \;`)。
  • "*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 が理解できないほど式は複雑ではありません。

    2.mtime +1` は 2日以上 前に変更されたファイルのみを選択します。

    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
 Community
Community
編集した答え 13日 4月 2017 в 12:37
18
0
 Panther
Panther
8日 4月 2015 в 1:38
2015-04-08T01:38:24+00:00
さらに
ソース
編集
#38378069

式を引用し、括弧も引用することをお勧めします。

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

または

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

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

find . -name "*2015*" -mtime +1
2
0
Gilles  &#39;SO- stop being evil
Gilles 'SO- stop being evil
8日 4月 2015 в 2:37
2015-04-08T14:37:28+00:00
さらに
ソース
編集
#38378071

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でこのテストを行うための便利な方法はありません。

2
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Ilya Smirnov
登録済み 6日前
2
Денис Васьков
登録済み 1週間前
3
Dima Patrushev
登録済み 1週間前
4
sirojidddin otaboyev
登録済み 2週間前
5
Елена Гайдамамакинат
登録済み 2週間前
JA
© kzen.dev :年
ソース
askubuntu.com
ライセンス cc by-sa 3.0 帰属