การเปลี่ยนชื่อไฟล์. jpg ในไดเรกทอรีย่อยโดยไม่เปลี่ยนวันที่สร้าง (บน MAC)


2

ฉันมีไฟล์ JPEG หลายไฟล์ที่มีชื่อเหมือนกัน (เช่น "orig.jpg") แต่ละไฟล์ในไดเรกทอรีย่อยแยกกัน แต่ละไดเรกทอรีย่อยมีชื่อที่ไม่ซ้ำกัน (เช่น xplmz3nc5n, tyrn5m6ktv, ฯลฯ ... )

ฉันต้องการเปลี่ยนชื่อ jpegs ตามวันที่ / เวลาที่สร้าง (เช่น 20120629_142536.jpg ฯลฯ )

ฉันสามารถใช้ photoshop เพื่อเปลี่ยนชื่อแบทช์แต่ละไฟล์ด้วยตัวระบุที่ไม่ซ้ำกัน คุณสมบัติหลักที่ได้รับอนุญาตนี้คือความสามารถของ photoshop ในการ "รวมไดเรกทอรีย่อยทั้งหมด" ในกระบวนการแบทช์ ฉันหวังว่าจะสามารถใช้ exiftool เพื่อเปลี่ยนชื่อไฟล์เพื่อรวมวันที่สร้าง (สำหรับการทำรายการง่าย) น่าเสียดายที่กระบวนการเปลี่ยนชื่อชุด photoshop จะเขียนวันที่สร้างไฟล์เป็นวันที่วันนี้ ...

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการแบทช์เปลี่ยนชื่อไฟล์ในชุดของไดเรกทอรีย่อยโดยใช้พูดคำสั่ง terminal?

แก้ไข

คำตอบที่นี่และรับผลลัพธ์ต่อไปนี้ในเทอร์มินัล

cd ~/foo
for dir in *; do 
    t=`stat -c %y "$dir" | awk '{print $1"-"$2}' | 
       cut -d ":" -f 1,2 | sed 's/://'`
    mv "$dir" "$t"_"$dir";
done

และได้รับ

สถิติ: ตัวเลือกที่ผิดกฎหมาย - การใช้งาน c: สถิติ [-FlLnqrsx] [รูปแบบ -f] [-t timefmt] [ไฟล์ ... ] สถิติ: ตัวเลือกที่ผิดกฎหมาย - การใช้งาน c: สถิติ [-FlLnqrsx] [-f รูปแบบ] [ -t timefmt] [ไฟล์ ... ] stat: ตัวเลือกที่ผิดกฎหมาย - การใช้งาน c: stat [-FlLnqrsx] [รูปแบบ -f] [-t timefmt] [ไฟล์ ... ]

(เช่นฉันลองสองวิธีที่แตกต่างกัน ... )


คุณลองอะไรด้วยตัวเองบ้างไหม?
สงสัย

"แต่จะไม่ทำงานในดาร์วิน .. " ทำไมคุณถึงพูดอย่างนั้น? คุณลองทำอะไรและผลลัพธ์คืออะไร
Ƭᴇcʜιᴇ007

ฉันจบลงด้วยสิ่งนี้จริงๆ โปรดโพสต์คำตอบถ้าคุณรู้ว่าจะทำอย่างไร ขอบคุณ
geordie

1
Graphic Converter (แชร์แวร์ไม่ฟรี แต่อาจมีรุ่นทดลองใช้ฟรี) มีตัวเลือกการเปลี่ยนชื่อที่ดี ฉันใช้สิ่งนี้ตลอดเวลาเพื่อจัดการภาพถ่ายดิจิทัลของฉัน หากคุณไม่ใช่โปรแกรมเมอร์ฉันจะลองใช้เครื่องมือที่เหมาะกับคุณ (I amโปรแกรมเมอร์และฉันยังคงใช้ "GC" สำหรับชนิดของสิ่งนี้!)
jimtut

คำตอบ:


2

ความเป็นไปได้ประการหนึ่งที่ใช้วันที่สร้าง EXIF ​​คือ (ยังไม่ทดลอง แต่ควรใช้ได้):

  • ย้ายไฟล์ทั้งหมดของคุณไปยังไดเรกทอรีเดียวกันเปลี่ยนชื่อเป็นชื่อที่ไม่ซ้ำกัน (เช่นชื่อของไดเรกทอรีที่มีบวกด้วย.jpgคำต่อท้าย)

    cd ~/foo
    for i in */; do
      # moves the file (supposedly named orig.jpg) in current directory
      # renaming it to the name of the containing sub directory
      mv ${i}orig.jpg ./`basename $i`.jpg
      # removes the subdirectory, assuming it is now empty
      rmdir $i;
    done
    

    หากไฟล์นั้นไม่ได้ชื่อเหมือนกันเสมอไป แต่มีเพียงไฟล์เดียว (ที่มีชื่อลงท้ายด้วย.jpg) ในไดเรกทอรีย่อยแน่นอนว่าคุณสามารถแทนที่mvคำสั่งด้วย:

      mv ${i}*.jpg ./`basename $i`.jpg
    
  • จากนั้นเปลี่ยนชื่อพวกเขาโดยใช้exiftool:

    exiftool -d %Y%m%d_%H%M%S.jpg "-filename<CreateDate" ~/foo
    

    สมมติว่าไม่มีไฟล์ใดที่จะมีเวลาสร้างเท่ากันจนถึงระดับวินาที หากมีความเสี่ยงที่จะเกิดการชนกันของชื่อไฟล์คุณสามารถใช้ตัวแปรที่เพิ่มคำต่อท้ายให้กับชื่อไฟล์ในกรณีที่ชื่อซ้ำกัน:

    exiftool -d %Y%m%d_%H%M%S%-c.jpg "-filename<CreateDate" ~/foo
    

ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชั่นการเปลี่ยนชื่อของexiftoolที่นี่: http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html


ฉันได้รับข้อผิดพลาดต่อไปนี้:mv: rename ff76e77ec7438371b42fc5027ad00486//orig.jpg to ./.jpg: No such file or directory
geordie

อ่า ... ไม่คิดว่าชื่อไดเรกทอรีจะลงท้ายด้วย / ทำงานบน Linux แต่ไม่จำเป็นต้องใช้กับ MacOS ... อัปเดตด้วยรุ่นที่ปรับปรุง ตอนนี้ฉันยังไม่มี Mac ที่จะทำการทดสอบโชคไม่ดี
Ale

btw คุณตรวจสอบว่าff76e77ec7438371b42fc5027ad00486/orig.jpgมีอยู่จริงหรือไม่?
Ale

ใช่ฉันตรวจสอบแล้ว ดูเหมือนจะมีปัญหาเกี่ยวกับไวยากรณ์ของรหัสที่แก้ไขใหม่ของคุณ พยายามค้นหาdirname/dirname.jpgและบอกว่าไม่มีไฟล์ดังกล่าว อาจต้องมีคนที่มี mac เพื่อทดสอบอย่างถูกต้อง ขอบคุณที่ทดลองใช้
geordie

คุณใช้ bash เป็นเชลล์หรือไม่?
Ale

1

น่าเสียดายที่ OSX ไม่มีเครื่องมือ GNU แต่มีอรรถประโยชน์หลักเป็น forks ของรุ่น BSD ซึ่งหมายความว่าบรรทัดคำสั่งจำนวนมากที่คุณพบสำหรับ Linux จะไม่นำมาใช้ อาจเป็นเพราะตัวเลือกที่เกี่ยวข้องหายไปหรือเป็นเพราะพวกเขาแตกต่างกัน

ฉันไม่มีเครื่อง OSX เพื่อทดสอบสิ่งนี้ แต่อ้างอิงจากหน้า OSX สำหรับstatและdateสิ่งนี้ควรทำสิ่งที่คุณต้องการ:

find . -name orig.jpg | 
    while read file; do
     echo mv "$file" "$(date -jf "$(stat -f '%m' "$file")" +%Y%m%d_%H%M%S)".jpg
    done

หากชื่อไดเรกทอรีของคุณมีช่องว่างหรือตัวอักษรแปลก ๆ อื่นให้ใช้ชื่อแทน:

find . -name orig.jpg -print0 | 
    while IFS= read -r -d '' file; do
     echo mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg
    done

ที่เพิ่งพิมพ์คำสั่งที่จะเรียกใช้ หากถูกต้องให้ลบechoและเรียกใช้อีกครั้งเพื่อเปลี่ยนชื่อไฟล์จริง อย่างที่ฉันพูดฉันไม่สามารถทดสอบสิ่งนี้ได้เนื่องจากฉันไม่สามารถเข้าถึงเครื่อง OSX ได้ดังนั้นคุณอาจต้องปรับแต่งมัน ดูที่หน้า man ที่ฉันเชื่อมโยงกับ (หรือเรียกใช้man statบนเครื่องของคุณ) ฉันไม่แน่ใจว่า OSX dateสามารถจัดการกับผลลัพธ์ของstat -f '%m'ถ้าไม่ให้ฉันรู้และฉันจะลองและช่วย

คำอธิบาย

  • find . -name orig.jpg: ค้นหาไฟล์ทั้งหมดที่เรียกซ้ำorigin.jpgในโฟลเดอร์ปัจจุบันซ้ำ ๆ
  • while read file; ... ; do: นี่จะบันทึกชื่อไฟล์แต่ละไฟล์ที่พบโดยfindเป็น$fileแล้วเรียกใช้คำสั่งถัดไปในแต่ละไฟล์
  • stat -f '%m' $file : สิ่งนี้ควรแสดงเวลาแก้ไขของไฟล์ในรูปแบบที่มนุษย์สามารถอ่านได้
  • $(date -jf "DATE" +%Y%m%d_%H%M%S): พิมพ์วันที่ที่กำหนดโดยDATEเป็น YYMMDD_HHMMSS เนื่องจากเรากำลังให้ผลลัพธ์มันstat -f '%m' $fileซึ่งจะพิมพ์วันที่ที่ไฟล์ถูกแก้ไข
  • mv "$file" "$(date -jf "$(stat -f '%m' $file)" +%Y%m%d_%H%M%S)".jpg: เปลี่ยนชื่อ$fileถึงวันที่ส่งกลับโดยและdate.jpg

คำสั่งเทียบเท่าบน Linux คือ:

find . -name orig.jpg | 
    while read file; do 
        echo mv "$file" "$(date -d "$(stat -c '%y' $file)" +%Y%m%d_%H%M%S)".jpg
   done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.