ใช้สถิติเพื่อจัดทำเวลาประทับสำหรับการสัมผัส


11

กำลังพยายาม OCR เอกสาร insitu บางส่วน (จากบรรทัดคำสั่ง linux บน windows share) กระบวนการของ OCRing คือการค้นหาและฉันได้สับสนโดยใช้คำสั่ง find เพื่อไพพ์ไฟล์ผ่านลูปอย่างถูกต้อง

อย่างไรก็ตามฉันจำเป็นต้องเก็บบันทึกเวลาดั้งเดิมไว้เพื่อแก้ไข ฉันกำลังพยายามใช้สถิติและแตะดังต่อไปนี้:

#!/bin/bash
OLDIFS=$IFS

    IFS=$(echo -en "\n\b")

    for f in `find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
         do
        ORIGTS=`stat -c "%Y" $f`
        sudo /opt/ABBYYOCR9/abbyyocr9 -rl English -pi -if $f -f PDFA -paemImageOnText -pafpr original -of $f
        touch -t $ORIGTS $f

    done

    IFS=$OLDIFS

แน่นอนคำสั่งสัมผัสล้มเหลว เรียกใช้คำสั่งแยกกันฉันสังเกตเห็น "stat -c" เป็นสิ่งที่ตามแนวนี้:

1334758696

ซึ่งก็เหมือนไม่มีวันที่ฉันรู้ ฉันรู้สึกราวกับว่าฉันสนิท แต่ไม่สามารถหาวิธีแปลงวันที่ที่ฉันมีให้เป็นเวอร์ชั่นที่เป็นมิตรได้ มันเป็นรูปแบบของวินาทีจากบางอย่าง?


นอกเหนือ: การใช้งานของคุณIFSดูเหมือนผิดปกติ คุณต้องการแยกแบ็คสเปซ ( \b) จริงๆหรือ ดูunix.stackexchange.com/questions/9496/…สำหรับเคล็ดลับ
มิเคล

คำตอบ:


17

stat'sผลผลิตเป็นที่ประทับเวลา Unix เรียกว่าวินาทีตั้งแต่ยุค

ทั้งหมด coreutils GNU ยอมรับว่าวันที่อนุญาตให้คุณใส่ประทับเวลาแทนโดย prefixing @ประทับเวลาด้วย

ดังนั้นลองสิ่งนี้

touch -d @$ORIGTS $f

ดูcoreutils - วินาทีนับตั้งแต่ยุค


อาที่อธิบายการประทับเวลาจำนวนมากที่ฉันได้เห็นในลินุกซ์ในขณะนี้! ขอบคุณมาก
Tim Alexander

8

touchสามารถใช้การประทับเวลาของไฟล์โดยใช้-rตัวเลือก คุณอาจต้องการที่จะส่งออกไปยังไฟล์ที่แตกต่างกัน (ฉันถือว่าด้านล่างว่า-ifเป็นไฟล์อินพุตและ-ofเป็นไฟล์ที่ส่งออก)

for f in ...; do
    sudo /opt/ABBYYOCR9/abbyyocr9 ... -if $f ... -of $f.new
    touch -r $f $f.new
    mv $f.new $f
done

+1 statสำหรับการหลีกเลี่ยง
l0b0

3

IFS=$(echo -en "\n\b")

เนื่องจากคุณสมมติว่าเปลือกด้วยecho -eและคุณมีทุบตีในสาย shebang IFS=$'\n\b'ของคุณอยู่แล้วคุณสามารถใช้ การทำให้ backspace เป็นตัวคั่นค่อนข้างแปลก คุณไม่ต้องการIFSสิ่งที่คุณทำอยู่แล้ว

OLDIFS=$IFS
...
IFS=$OLDIFS

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

`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`

findไม่เคยใช้แทนคำสั่งในการส่งออกของ

  • $IFSกลุ่มนี้จะแบ่งการส่งออกที่ตัวละครในนั้น หากคุณตั้งค่าIFSเป็นบรรทัดใหม่สิ่งนี้จะแยกเอาต์พุตที่บรรทัดใหม่ แต่คุณยังคงไม่สามารถจัดการชื่อไฟล์ที่มีบรรทัดใหม่ได้
  • ไม่เพียง แต่ผลลัพธ์ของการแทนที่คำสั่งจะแบ่งออกเป็นคำต่าง ๆ แต่แต่ละคำจะถูกใช้เป็นรูปแบบกลม หากคุณไฟล์ที่เรียกว่าA[12].pdf, A1.pdfและคุณจะจบลงด้วยA2.pdf A1.pdf A2.pdf A1.pdf A2.pdfคุณสามารถปิด globbing ด้วยset -f(และกลับมาพร้อมกับset +f) แต่ที่นี่ (เหมือนเวลาส่วนใหญ่) วิธีที่ถูกต้องคือไม่ใช้การทดแทนคำสั่ง

ใช้-execอาร์กิวเมนต์เพื่อfind(หรือถ้าระบบของคุณมี-print0คุณสามารถใช้find … -print0 | xargs -0 …แทนได้สิ่งนี้มีประโยชน์สำหรับการดำเนินการกับหลาย ๆ ไฟล์พร้อมกันหากคุณต้องการความสะดวกในการพกพาไปยังระบบ Linux โบราณหรือระบบ OpenBSD ปัจจุบันที่มี-print0แต่ไม่-exec … {} +)

ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f

โปรดทราบว่าคุณไม่มีเครื่องหมายอัญประกาศคู่ล้อมรอบ$f(ไม่จำเป็นถ้าสิ่งเหล่านี้เป็นผลลัพธ์ของการแยกและคุณไม่ได้เปลี่ยนIFSตั้งแต่นั้นมาและปิดการวนรอบ แต่จริงๆแล้วให้ใส่เครื่องหมายคำพูดคู่เสมอยกเว้นว่าคุณรู้ว่าทำไมคุณถึงสามารถ อย่าปล่อยไว้)

นี่คือเงอะงะและไม่ใช่พกพา ( statไม่มีอยู่ในทุกระบบและข้อโต้แย้งนั้นแตกต่างกันไปตามระบบที่มีอยู่) มีตัวเลือกแบบพกพาในการตั้งค่าไฟล์เพื่อการประทับเวลาของไฟล์อื่น:touch touch -r REFERENCE_FILE FILEฉันอยากจะแนะนำหนึ่งในสองวิธีแทน:

  • หากคุณทำได้ก่อนอื่นให้แปลงไฟล์ต้นฉบับเป็นไฟล์ใหม่จากนั้นเรียกใช้touch -rเพื่อกำหนดวันที่ของไฟล์ใหม่และย้ายไฟล์ใหม่ไปไว้ในที่สุด มันจะดีกว่าเพื่อให้แน่ใจว่าผลลัพธ์ที่ดีก่อนที่จะมีอะไรเกิดขึ้นกับอินพุต; มิฉะนั้นหากการแปลงถูกขัดจังหวะด้วยเหตุผลใด ๆ (เช่นความล้มเหลวของพลังงาน) คุณจะสูญเสียข้อมูล
  • หากการแปลงเป็นกล่องดำที่คุณไม่สามารถควบคุมได้คุณสามารถใช้touch -rสองครั้ง: หนึ่งครั้งเพื่อบันทึกวันที่ของไฟล์ต้นฉบับในไฟล์ชั่วคราวที่ว่างเปล่า (ซึ่งจะถูกสร้างขึ้นโดยอัตโนมัติ) จากนั้นอีกครั้งหลังจากการเปลี่ยนแปลงเพื่อกู้คืนวันที่ ใช้ไฟล์ชั่วคราว

ดังนั้น:

find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
     -exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;

0

ด้วยเหตุผลบางอย่างฉันพลาดคำตอบเกี่ยวกับtouch -r; ถ้าด้วยเหตุผลแปลก ๆ บางอย่างที่คุณไม่ต้อง GNU coreutils' statเช่นเดียวกับในคำตอบที่ได้รับการยอมรับไม่สามารถใช้touch -rที่นี่เป็นวิธีที่จะได้รับการประทับเวลาในtouchรูปแบบที่เป็นมิตรกับ statBSD

% /usr/bin/stat -f '%Sm' johnson                   
Oct 23 22:51:00 2012
% /usr/bin/stat -t '%Y%m%d%H%M.%S' -f '%Sm' johnson
201210232251.00
% touch foo
% touch -t $(/usr/bin/stat -t '%Y%m%d%H%M.%S' -f '%Sm' johnson) foo
% /usr/bin/stat -f '%Sm' foo                    
Oct 23 22:51:00 2012

แต่จริงๆใช้เพียงtouch -r:

% touch foo
% touch -r johnson foo
% /usr/bin/stat -f '%Sm' foo
Oct 23 22:51:00 2012

0

ฉันมีปัญหาเดียวกันมาจาก 'กระบวนการสร้างภาพยนตร์'

ในตัวอย่างด้านล่างorig_file.wavเป็นไฟล์ที่มีการประทับเวลาดั้งเดิมในขณะที่processed_file.wavเป็นไฟล์ที่มีเนื้อหาเหมือนกัน แต่การประทับเวลาไม่ถูกต้อง

ก่อน:

localhost $ ls -lh orig_file.wav processed_file.wav Jan 23 17:15 processed_file.wav Jul 9 2018 orig_file.wav

คำสั่ง:

localhost $ touch -t $(date --date=@`stat -f%B orig_file.wav` +%Y%m%d%H%M.%S) processed_file.wav

หลังจาก:

localhost $ ls -lh orig_file.wav processed_file.wav Jul 9 2018 processed_file.wav Jul 9 2018 orig_file.wav

หมายเหตุ:

statin ticks แบบ Inverted ให้คุณบันทึกเวลาการสร้างไฟล์ต้นฉบับเป็นเวลา unix epoch (เป็นวินาที) @ จาก coreutils แปลงเป็นวันที่ iso ที่dateสามารถเข้าใจและจัดรูปแบบใหม่ด้วย YYYYMMMMDDHHmm.SS เพื่อให้touchสามารถเข้าใจได้ ฉันใส่dateคำสั่งลงใน $ () ซึ่งเทียบเท่ากับเครื่องหมายขีดกลับด้านเนื่องจากไม่สามารถนำกลับมาใช้ใหม่ได้ในคำสั่งเดียวกัน


(1) สิ่งนี้ดูเหมือนจะเกือบจะเหมือนกับคำตอบของ Nicholas Rileyแต่ซับซ้อนกว่า ทำไมทุกคนต้องการใช้สิ่งนี้มากกว่าที่จะ (หรือยังดีกว่าคำตอบของเกล็นแจ็คแมนโดยใช้touch -r) (2)  stat สามารถใส่$(…); สามารถใช้ได้หลายครั้งในหนึ่งคำสั่ง
G-Man กล่าวว่า 'Reinstate Monica'

นอกเหนือจากคำตอบของเขาโดยใช้เวลาแก้ไขแทนที่จะสร้างเวลาคุณดูเหมือนจะถูกต้อง ฉันไม่ได้สังเกตคำตอบนี้ คุณสามารถลงคะแนนของฉัน
dominikz

ถ้าคุณขอให้ฉันมันไม่สนุก :-) ⁠
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.