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