4

このスクリプトを見つけて微調整し、ディレクトリ内の最近変更されたファイルを再帰的に見つけました。ディレクトリ名にスペースがある場合にのみ壊れます。スペースのあるディレクトリも読み取るように、スクリプトを調整するのを手伝ってくれる人はいますか?s

for i in *; do

find $i -type f | perl -ne 'chomp(@files = <>); my $p = 9; foreach my $f (sort { (stat($a))[$p] <=> (stat($b))[$p] } @files) { print scalar localtime((stat($f))[$p]), "\t", $f, "\n" }' | tail -1

done
4

5 に答える 5

3

パール?あなたは bash を持っておらず、長いコード行を書くのが好きですか? ;-)

find . -type f -printf '%T+ %p\n' | sort -r | head -n1
于 2012-09-19T08:53:36.563 に答える
2

引用はすべてを修正します。

find "$i" -type f

また、必要ありませんtail。印刷後にスワップ$aして終了するだけです。$b

find $i -type f | perl -lne 'chomp(@files = <>); my $p = 9; foreach my $f (sort { (stat($b))[$p] <=> (stat($a))[$p] } @files) { print scalar localtime((stat($f))[$p]), "\t", $f; exit }'

And -l(文字 "ell") は、印刷時に改行を追加します。

編集:

実際、ループはまったく必要ありません。

find  -type f | perl -lne 'chomp(@files = <>); my $p = 9; @files = sort { (stat($b))[$p] <=> (stat($a))[$p] } @files; print scalar localtime((stat($files[0]))[$p]), "\t", $files[0]'
于 2012-05-22T17:41:06.123 に答える
1

すべてを Perl で書いたほうが面倒ではないようです

perl -MFile::Find -e 'find(sub{@f=((stat)[9],$File::Find::name) if -f && $f[0]<(stat)[9]},".");print "@f")'
于 2012-05-22T18:18:06.473 に答える
0

デフォルトでは、以下のコードは現在の作業ディレクトリの下のサブツリーを検索します。コマンドラインで、検索するサブツリーをもう1つ指定することもできます。

#! /usr/bin/env perl

use strict;
use warnings;

use File::Find;

my($newest_mtime,$path);
sub remember_newest {
  return if -l || !-f _;
  my $mtime = (stat _)[9];
  ($newest_mtime,$path) = ($mtime,$File::Find::name)
    if !defined $newest_mtime || $mtime > $newest_mtime;
}

@ARGV = (".") unless @ARGV;
for (@ARGV) {
  if (-d) {
    find \&remember_newest, @ARGV;
  }
  else {
    warn "$0: $_ is not a directory.\n";
  }
}

if (defined $path) {
  print scalar(localtime $newest_mtime), "\t", $path, "\n";
}
else {
  warn "$0: no files processed.\n";
  exit 1;
}

書かれているように、コードはシンボリックリンクをたどりません。コマンドラインでシンボリックリンクに名前を付けると、次の出力が表示されます。

$ ./find-newest〜/link-to-directory
./find-newest:ファイルは処理されません。

bashでは、間接参照を強制するために末尾にスラッシュを追加する必要があります。

$ ./find-newest〜/ link-to-directory /
1月1日木曜日00:00:001970hello-world
于 2012-05-22T19:22:00.107 に答える
0

現在のディレクトリのみを処理するため、1 つのコマンドのみで実行できます。

find . -type f | perl -ne 'chomp(@files = <>); my $p = 9; foreach my $f (sort { (stat($a))[$p] <=> (stat($b))[$p] } @files) { print scalar localtime((stat($f))[$p]), "\t", $f, "\n" }' | tail -1
于 2012-05-22T17:42:04.800 に答える