• ベストアンサー

下階層のファイルを含めての最新ファイルの検索

UNIXで下階層のdirにあるファイルも含めて最新のタイムスタンプのファイルを探したいのですがいい方法はないでしょうか?できればスクリプトを組まずにできればありがたいのですが、無理ならスクリプトを使用してでもできる方法を教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • geshon
  • ベストアンサー率61% (44/72)
回答No.2

perlスクリプト(とfind) だとこんな感じでしょうか? #!/usr/bin/perl open FH, "find @ARGV -type f |" or die; while (<FH>){ chop; @f = stat; if ($f[9] > $t) { $t=$f[9]; $fn=$_; next; }elsif ($f[9] == $t) { $fn.="\n$_"; } } print $fn; 適当なファイル名で保存して実行属性をつけてください。 $[このファイル名] [探したいpath...] 同じ更新日時のファイルが複数あっても対応可能です。 path は1個でも複数個でも実行できます。 少しいじれば更新日時の若い順 n個を表示させることもできます。

Kasaoka-Taroh
質問者

お礼

ありがとうございます。このスクリプトを参考になんとかやりたいことができそうです。

その他の回答 (1)

回答No.1

GNUのツールを使って良ければ簡単です。 $dir以下を調べるとして、 find $dir -type f -exec stat -c "%Z %n" {} + | sort -nr | head -1 | cut -d' ' -f 2 それぞれのオプションは詳しくはmanやinfoを見てもらうとして、 findでは$dir以下の普通のファイルを対象にstatを各々に適用、 statはフォーマット文字列を指定して、最終変更時間(UNIX time)とファイル名を表示、 sortでUNIX timeの逆順にソート、 headで最初の1行を抜き出して、 cutで空白を区切りとして2番目のフィールド(ファイル名)を表示という感じです。

関連するQ&A

  • ファイルコピー

    以前、タイムスタンプが最新のファイルをコピーするスクリプトを教えてもらったんですが、1つ前のファイルもコピーするにはどのように記載すればいいのでしょうか? どなたか教えて下さい。 for /f "delims=" %%F in ('dir /b /od c:\nepia') do set F=%%F

  • フォルダ内の、最新のタイムスタンプのファイルを1つだけ取り出す(VBscript)

    フォルダ内に複数のファイルが存在しており、その中でタイムスタンプが一番最新のファイルをコピーしたいと考えているのですが、ファイル同士のタイムスタンプを比較する方法が見つけられませんでした。どなたかご存知の方がいらっしゃいましたら、教えて頂けませんか?

  • 最新のファイルのみ検索

    サーバー内のファイルを検索するのにKentWebさんのwwwsrch.cgiを利用しています。 # # すべてのファイルをなめ回す # sub search1 { local($dir) = $_[0]; local(@filelist, $file, $filename); opendir(DIR, $dir); @filelist = readdir(DIR); closedir(DIR); foreach $file (@filelist) { if ($file eq ".") { next; } if ($file eq "..") { next; } $filename = "$dir/$file"; if (-d $filename) { if ($recursive_flag) { &search1($filename); } } else { &search2($filename, $dir); } } } # # ファイルの中身を検索する # # 指定していない拡張子のファイルは無視する $suffix = ".html .cgi .pl"; $fname = substr($target, rindex($target, ".")); if ($suffix{$fname} != 1) { return; } ↑の条件に30日以上古いファイルを無視するように改造することはできないでしょうか? 検索対象ファイルが数十万以上と莫大に増加してきたため、最新のファイルのみ検索対象にできればと考えております。

    • ベストアンサー
    • Perl
  • ファイルのタイムスタンプの取得

    UNIXにて プログラムを組まないで、ファイルのタイムスタンプの 取得方法がありますか?ご存知の方は教えてください。 以上、宜しくお願いします。

  • ディレクトリ内の最新ファイルのみをコピーが上手くいかない

    下記のようなスクリプトにより、 ./ディレクトリ内の更新日付が最新のファイル名を取得し、 そのファイルを./bbbディレクトリにコピーするということを行いたいのですが、 更新日付が最新のものに関わらず全てのファイルがコピーされてしまいます。 <?PHP $dir = opendir("./"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $to="./bbb/".$fnm; if(!file_exists($to)) copy("./".$fnm,$to); } } closedir($dir); ?> 自力ではどこがヘンなのか理解できないため、どなたか教えてください。

    • ベストアンサー
    • PHP
  • シェルスクリプトで古いファイルの自動削除をするには?

    UNIXで以下の仕様を持つシェルスクリプトを作成しようと していますが、どうもうまくいきません。 どなたか、いい知恵を貸していただけないでしょうか? 目的: 特定のディレクトリ内にあるファイルについて、 システム日付より3日前のタイムスタンプを持つファイルを 削除する。 留意点: ・削除対象のファイルは複数存在する場合がある。 ・ファイルサイズは1件あたり 0byte-数百Mbyte となる  可能性がある。 ・ファイル名は不定。 ・スクリプトはBシェルまたはCシェルとする。 参考: ・現在使用しているOSについて  ls -l でのタイムスタンプにおける出力形式は以下のとおり  (デフォルト値?)  ・ 9月 28日 2000年    または   10月 24日 10時45分 知っている限りのコマンドを使っていろいろやってみたんですが、 結局ダメでした。 よろしくお願いします。

  • UNIXで2つのdir内のファイルのチェック

    UNIXで2つのdir内に存在するファイルのチェックをやりたいのですが なさけないことにいい方法が思いつきません。 具体的にはDIR-A内に存在するファイルが全てDIR-B内に存在するか どうかをチェックして存在してないものを出力といったことです。 方法はUNIX上で実行できればとくに問いません。

  • 全てのフォルダから最新ファイルを残し削除

    WindowsServer2008にて、 バックアップフォルダを定期的にリフレッシュ (最新以外を削除)するバッチを作りたいです。 CやVBなど、While文、関数のある言語でのプログラム経験がありますが バッチの方は不案内です。何卒ご教授くださいませ。 [処理内容] C:\testdir の配下に、サブフォルダdir1,dir2,dir3が存在します。 C:\testdir にバッチファイル、「dalete.bat」を配置。 実行するのはこの「dalete.bat」になります。 サブフォルダ dir1,dir2,dir3 の中のファイルは、 「no0.zip」,「no1.zip」,「no2.zip」と、規則的な名前です。 残したいのは「no0.zip」,「no1.zip」,「no2.zip」のうち、最新のファイル1個のみです。 [コード1] 次のようなプログラムを書きました。 まずは[dir1]フォルダのみの、 最新ファイル以外を削除するプログラムです。 ------------------------------------------ set L_FILE=C:\testdir\Delete.log echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE% REM 1フォルダ処理 cd dir1 REM 最新ファイルをリネーム保護 for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a echo "%fname%" をリネーム保存 >> %L_FILE% copy "%fname%" "LASTFILE.zip" REM 他のファイルを削除 del "no*.zip" >> %L_FILE% REM リネーム保護を戻す ren "LASTFILE.zip" "%fname%" echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE% ------------------------------------------ 結果ログ 2013/11/29 2:17:15 処理開始 "no0.zip" をリネーム保存 2013/11/29 2:17:15 処理完了 ------------------------------------------ フォルダ[dir1]の中身は"no0.zip"のみで、期待した動きです。 [コード2] 次に、[dir1],[dir2],[dir3]全てのフォルダに対し、 最新以外のファイルを削除するコードを、以下のように書きました。 ------------------------------------------ set L_FILE=C:\testdir\Delete_all2.log echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE% REM フォルダ全てを処理 for /D %%i in (C:\testdir\*) do ( echo %%i フォルダ処理開始 >> %L_FILE% cd %%i REM 最新ファイルをリネーム保護(★) for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a echo "%fname%" をリネーム保存 >> %L_FILE% copy "%fname%" "LASTFILE.zip" REM 他のファイルを削除 del "no*.zip" >> %L_FILE% REM リネーム保護を戻す ren "LASTFILE.zip" "%fname%" ) echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE% ------------------------------------------ 結果ログ 2013/11/29 2:22:03 処理開始 C:\testdir\dir1 フォルダ処理開始 "" をリネーム保存 C:\testdir\dir2 フォルダ処理開始 "" をリネーム保存 C:\testdir\dir3 フォルダ処理開始 "" をリネーム保存 2013/11/29 2:22:03 処理完了 ------------------------------------------ コード1で、動作確認が取れたコードですが、 ★部で、最新ファイルの取得に失敗しています。 結果、削除処理のみ期待通りに処理されサブフォルダ内の 全ファイルが削除されています。 どうすれば、全フォルダ、最新のみを残しループさせる事が出来るのでしょうか。 どうかお助けください。

  • ファイルコピー

    c:\nepiaフォルダ内にある最新のファイルをコピーしたいんですが、タイムスタンプが一番新しいファイルをコピーする事は可能でしょうか?

  • タイムスタンプでファイルを指定する方法

    UNIXコマンドにおいて、ファイル名から日付を判断できないファイルを消す為に、 ファイルのタイムスタンプを指定する方法を教えてください。 やりたいこととしては以下のようになります。 ・4月から7月の間に更新されたファイルを削除したい ・ファイルは同一ディレクトリに1000以上あり、消したいファイルはその内600ほどある