我有一个包含数百张图像的目录,其中大多数是原始格式(以 CR2 结尾),但有些我已将它们转换为 jpg,因此我同时拥有 CR2 和 JPEG。
如何获取所有以 jpg 和 cr2 结尾的文件并将它们移动到另一个目录。
所以ls *.jpg
会给我所有以 jpg 结尾的文件,然后我需要从那里找到以 cr2 结尾的文件?我该怎么做?然后我该如何移动它们?
答案1
我将用find(1)
这个任务来完成:
find . -name '*.jpg' -exec /bin/sh -c 'A=`basename {} .jpg`.cr2 ; test -f $A && mv {} $A /other/dir' \;
答案2
一个快速的 bash 行如下:
for FILE in `ls *.jpg`; do BF=`basename $FILE .jpg`;
if test -e $BF.cr2 ; then mv $BF.jpg $BF.cr2 destdir/; fi; done
答案3
您需要编写一个脚本来执行此操作,其中 Python 或 Perl 可能是最好的选择。
这是我使用 Perl 编写的脚本,它基本上可以完成这些任务(jpeg 和 raw 文件),并自动将它们移动到“日期目录结构”(即 YYYY/MM-month/DD)。它使用库Image::ExifTool
来提取照片的日期,以便知道将其放在哪里。
对于您的确切问题,您可以看到它找到所有 .jpg 文件,计算出基本名称,然后检查匹配的 .nef 文件。
#! /usr/bin/perl
$dryrun = 0;
$encode = 1;
use Image::ExifTool;
use Dumpvalue;
my $Dumper = new Dumpvalue();
@Months = qw(00 01-January 02-February 03-March 04-April 05-May 06-June 07-July 08-August 09-September 10-October 11-November 12-December);
$startdir = shift @ARGV;
die "error: no start directory specified\n" unless ($startdir ne "");
foreach $file (split(/\n/,`find "$startdir" -name "*.[Jj][Pp][Gg]" -print | sed -e 's,^\./,,'`)) {
next if ($file =~ m,(^|/).xvpics/,);
print STDERR "$file => ";
my $exif = new Image::ExifTool;
$info = $exif->ImageInfo($file);
if (ref($info) != "HASH") {
print STDERR "error: could not read exif data from '$file' ($@)\n";
next;
}
($filename) = ($file =~ m,([^/]+)$,);
# $Dumper->dumpValue($info);
# next;
# exit(1);
$date = $info->{"CreateDate"};
#print STDERR $date," => ";
unless (($y,$m,$d,$h,$n,$s) = ($date =~ m/^(\d\d\d\d)\D(\d\d)\D(\d\d)\D+(\d\d)\D(\d\d)\D(\d\d)($|\D)/)) {
$date = $info->{"FileModifyDate"};
unless (($y,$m,$d,$h,$n,$s) = ($date =~ m/^(\d\d\d\d)\D(\d\d)\D(\d\d)\D+(\d\d)\D(\d\d)\D(\d\d)($|\D)/)) {
print STDERR "$file: no date for '$file' (skipped)\n";
next;
}
}
next if ($file eq "$outdir/$filename");
system("mkdir","-p",$outdir) unless (-d $outdir || $dryrun);
print STDERR "$outdir/".$filename;
rename($file,"$outdir/".$filename) unless $dryrun;
$jpgfile = $filename;
$file =~ s/\....$/\.nef/;
$filename =~ s/\....$/\.nef/;
if (-f $file) {
print STDERR " ($outdir/$filename)";
rename($file,"$outdir/".$filename) unless $dryrun;
chmod(0644, "$outdir/".$jpgfile) unless $dryrun;
}
print STDERR "\n";
}
这是不是高质量的代码。:-)这是我为自己编写的黑客程序,但应该可以作为一个合理的例子。
答案4
将此脚本中的“move2dir”(两次)更改为文件最终所在的位置,然后从 jpg 和 cr2 文件所在的目录运行它。
for file in `ls *jpg`
do
if [ -e ${file/%jpg/cr2} ]
then
cr2file=${file/%jpg/cr2}
mv $file move2dir/
mv $cr2file move2dir/
echo moved $file and $cr2file
fi
done