根据创建的日期重命名JPG文件

时间:2011-01-17 07:01:07

标签: linux unix command-line

我想重命名某个目录中的所有文件。将它们重命名为创建日期 因此,如果我的文件是Image1.jpg,它应该重命名为“Jan 16 12:09:42 2011.jpg” 我想通过命令行执行此操作。我一直在努力:

stat -f %SB Image0100.jpg

但是如何将其与mv命令结合使用?我将如何在整个文件中迭代statmv? 或者是否有简单的方法来重命名所有文件及其日期创建?

11 个答案:

答案 0 :(得分:55)

jhead -n DSCN0382.JPG
DSCN0382.JPG --> 0408-150734.jpg

也可以给出任何strftime参数:

jhead -n%Y%m%d-%H%M%S *.jpg 

这将重命名与* .jpg匹配的文件,格式为YYYYMMDD-HHMMSS

jhead -n%Y%m%d-%H%M%S DSCN0382.JPG
DSCN0382.JPG --> 20120408-150734.jpg

另请参阅手册页以获取许多其他很酷的选项。例如,您可以更正(转移)EXIF日期。当某些相机的时间设置不正确时,这在合并来自不同相机的文件时非常方便。

答案 1 :(得分:15)

如果你正在使用包含EXIF数据的JPG(即来自数码相机),那么你可以使用以下来获取创建日期而不是stat。

exif -t 0x9003 -m Image0100.jpg

每个请求,这是命令和输出。有几点需要注意:

  • 由于并非每个文件都有exif数据,因此我们要在执行其余命令之前检查dst是否有效。
  • exif的输出有一个空格,它是文件名的PITA。使用sed替换为' - '。
  • 请注意,我在mv之前使用'echo'来测试我的脚本。当你确信它正在做正确的事情时,那么你可以删除'echo'......你不想最终像那个让所有文件被吹走的人。

命令

for i in *.jpg; do
  dst=$(exif -t 0x9003 -m $i ) &&
  dst_esc=$(echo $dst | sed 's/ /-/g' ) &&
  echo mv $i $dst_esc.jpg
done

输出

'12379632.jpg' does not contain tag 'DateTimeOriginal'.
mv 15084688.jpg 2003:02:28-21:48:54.jpg
mv 15136312.jpg 2003:03:01-10:36:05.jpg
mv 15137960.jpg 2003:03:01-10:36:38.jpg
mv 15140744.jpg 2003:03:01-10:37:46.jpg

答案 2 :(得分:5)

for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$

答案 3 :(得分:1)

大多数POSIX文件系统都不记录创建时间(即使记录了API,API肯定不会公开它),所以你是SOL。

答案 4 :(得分:1)

$ for i in *; do mv "$i" "`stat -f %SB $i`"; done

答案 5 :(得分:1)

find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'

答案 6 :(得分:1)

还有:

rename -v 's/.JPG/.jpeg/' *.JPG
rename -v 's/.jpeg/.jpg/' *.jpeg
exiv2 -r'RP_%Y%m%d_%H%M%S' rename *.jpg

以RP_20120801_063021.jpg为例。这适用于Debian Linuxes(例如Ubuntu)。

重命名命令适用于某些图像为.JPG或.jpeg的情况。无法将.JPG直接转换为.jpg,因为它被解释为相同...

答案 7 :(得分:1)

如果你像我一样,一遍又一遍地谷歌,因为你已经老了,不能记住事情,你也可以使用gThumb,它有一个批量重命名,效果很好,有一个古老的名字 - >新名称预览。非常好。

答案 8 :(得分:0)

在带有Bash的MacOS X 10.6.6上(我认为,使用Korn shell),这适用于包含空格的文件名:

echo > "x y"
for file in *
do
    x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S' "$file")
    mv "$file" "$x"
done

它还使用从ISO 8601派生的符号来表示日期和时间。显然,如果两个文件具有相同的修改时间,那么按字母顺序排列的那个文件中的最后一个文件是唯一可以使用的文件。这也会丢失任何后缀。如果您正在处理' .jpg'文件,您可能想要使用:

echo > "x y,jpg"
for file in *.jpg
do
    x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S.jpg' "$file")
    mv "$file" "$x"
done

由于输出名称($ x)中没有空格,因此不需要" $ x"在移动命令中,但它们的存在是一致的。

答案 9 :(得分:0)

只需使用exiftool即可。以下是its documentation的示例:

   exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
        Both the directory and the filename may be changed together via the
        "FileName" tag if the new "FileName" contains a '/'.  The example above
        recursively renames all images in a directory by adding a "CreateDate"
        timestamp to the start of the filename, then moves them into new
        directories named by date.

答案 10 :(得分:0)

Perl替代方案:

我非常喜欢用perl添加固定字符串前缀的短模式:

/bin/ls *.jpg | perl -pe 's/.*/mv "$&" "prefix_$&"/' | sh

要制作日期前缀,它会有点复杂。

cat >t.pl

while(<*.jpg>) {
    $mtime = (stat($_))[9];
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
    $year += 1900;
    ++ $mon;
    printf("mv \"%s\" \"%d-%.2d-%.2d-%s\"\n", $_, $year, $mon, $mday, $_)
}

perl t.pl | sh