web-dev-qa-db-ja.com

macOSターミナルはディレクトリ内の最新のファイルを検索します

私は、DSLRからAppleの標準Photos.appにインポートされた最新の写真を識別するための簡単な小さなbash関数を書いています(私が思っていたもの)。

これまでのところ、次のようになっています。

find ~/Pictures/Photos\ Library.photoslibrary/Masters -type f

ものすごく単純。そのまま、インポートされた写真のライブラリ全体が一覧表示されます。私の最初の本能は単に| tail -n 1でしたが、ファイルは識別可能な順序でリストされていません。

| sort -Vを検討しましたが、ファイル名(つまり、IMG_0123.CR2)が故障することは珍しくありません。

参考:このBSDバージョンのfindは、GNUバージョンにある-printfオプションをサポートしていません。

2
voices

同様の質問に対するこの回答を見つけました 注文検索-変更日別の結果

あなたの場合、それは次のようなものでなければなりません:

find ~/Pictures/Photos\ Library.photoslibrary/Masters -type f -print0 | xargs -0 ls -tl

それがどのように相互作用するかについてのより多くの情報は上のリンクで見つけることができます。

4
David Lindegren

このPerlスクリプトを検索$ PATHのどこかに保存し、chmod実行可能にしてから、実行します。名前や日付で並べ替えるなど、いくつかのオプションの入力を求められます。これは私が何年も前に書いた古いスクリプトです。あまりゴミ箱に捨てないでください。それは機能します!

#!/usr/bin/Perl -w

# This script finds files or folders that have been modified "recently"
# (as determined by the timeframe specified in the arguments).
# Just run the script to get the full usage instructions.

use strict;
use File::Find;
use Config;

my $time;
my $units;
my $dir;
my $order = "time";
my @validUnits = qw(sec min hours days);
my @results;
my %results;

if ($#ARGV < 1) {
  print "\nUSAGE: $0 [-f] <time> <units> [dir]\n\n";
  print "Search for recently modified files or folders located\nin (or under) dir (which is \".\" if not specified).\n";
  print "\nResults are sorted by timestamp, in ascending order, unless the '-f' option is used\n";
  print "to specify sorting by filename.\n";
  print "\nPlease enter the time (just a number): ";
  $time = <>;
  chomp $time;
  print "Please enter the units (@validUnits): ";
  $units = <>;
  chomp $units;
  print "Please enter the directory: [.] ";
  $dir = <>;
  chomp $dir;
  if ($dir eq "") { $dir = "." }
  print "Sort order (file or time): [time] ";
  $order = <>;
  chomp $order;
  if ($order eq "") { $order = "time" }
  print "\n";
}
else {
  if ($ARGV[0] eq "-f") {
    $order = "filename";
    shift;
  }
  $time = shift;
  $units = shift;
  if ($#ARGV > -1) {
    $dir = shift;
  }
  else {
    $dir = ".";
  }
}

# Check the time entered.
if (!($time) || !($time =~ m/^[0-9]*$/)) {
  print "You must enter an integer for the length of time.\n";
  exit 1;
}

# Check the units entered.
my $validUnits = grep m/$units/, @validUnits;
if (!($units) || !($validUnits)) {
  print "You must use one of the valid units: @validUnits\n";
  exit 1;
}

if ("min" eq $units) { $time *= 60 }
if ("hours" =~ m/$units/) { $time *= 60 * 60 }
if ("days" =~ m/$units/) { $time *= 60 * 60 * 24 }
my $now = time();
my $then = $now - $time;

find
  (
     sub {
       # If you can't get the mtime for a file, it's probably a dead link.
       # Set $mtime back to "0", to remove this dead link from consideration.
       # NOTE: all links are resolved, so $mtime reflects the mtime of the
       # link target, not the link itself.
       my $mtime = (stat)[9] || "0";
       if ($mtime > $then) {
     # If the $mtime is more recent than the target ($then),
     # add the mtime to the %results hash,
     # keyed by filename (w/ relative path)
     $results{$File::Find::name} = $mtime;
       }
     }
     , $dir
  );

# Get all the keys (filenames) of the %results hash.
# If we're sorting by "time", re-sort @results by the timestamp.
@results = sort keys %results;
if ($order eq "time") {
  @results = sort { $results{$a} <=> $results{$b} } @results;
}

foreach my $key (@results) {
  # If we're sorting by "time", print the time first, followed by filename.
  # Else, print filename first, followed by time.
  if ($order eq "time") {
    print localtime($results{$key}) . ": $key\n";
  }
  else {
    print "$key: " . localtime($results{$key}) . "\n";
  }
}

if ($Config{'osname'} eq "MSWin32") {
  print "\nPress RETURN to exit.\n";
  <>;
}
1
jimtut