簡體   English   中英

根據創建的日期重命名JPG文件

[英]Rename JPG files according to date created

我想重命名某個目錄中的所有文件。 將它們重命名為創建日期。
因此,如果我的文件是Image1.jpg,它應該重命名為“Jan 16 12:09:42 2011.jpg”
我想通過命令行執行此操作。 我一直在努力:

stat -f %SB Image0100.jpg

但是我怎樣才能將它與mv命令結合起來呢? 我將如何在整個文件中迭代statmv
或者是否有簡單的方法來重命名所有文件的日期創建?

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

任何strftime參數也可以給出:

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

這將以YYYYMMDD-HHMMSS格式重命名與* .jpg匹配的文件

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

另請參閱手冊頁以獲取許多其他很酷的選項。 例如,您可以更正(轉移)EXIF日期。 當某些相機的時間設置不正確時,合並來自不同相機的文件時非常方便。

如果您正在使用包含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
for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$

還有:

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,因為它被解釋為相同...

如果你像我一樣,一遍又一遍地谷歌,因為你變老了,記不起來了,你也可以使用包含批量重命名的gThumb,效果很好並且有一個舊名字 - >新名字預習。 真的很好。

大多數POSIX文件系統都不記錄創建時間(即使記錄了API,API肯定不會公開它),所以你是SOL。

$ for i in *; do mv "$i" "`stat -f %SB $i`"; done
find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'

一個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

在帶有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”周圍的引號,但它們的存在是一致的。

只需使用exiftool 以下是其文檔中的示例:

   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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM