Saya mencoba untuk OCR beberapa dokumen insitu (dari baris perintah linux di berbagi windows). Proses OCRing ditemukan dan saya telah kacau menggunakan perintah find untuk mem-pipe file melalui loop dengan benar.
Namun saya perlu mempertahankan cap waktu asli untuk dimodifikasi. Saat ini saya mencoba menggunakan stat dan sentuh seperti di bawah ini:
#!/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
Tentu saja perintah sentuh gagal. menjalankan perintah secara terpisah saya perhatikan "stat -c" adalah sesuatu di sepanjang baris ini:
1334758696
yang seperti tidak ada tanggal yang saya tahu. Saya merasa seolah-olah saya sudah dekat tetapi tidak tahu cara mengubah tanggal yang saya miliki menjadi versi yang ramah sentuhan. Apakah ini beberapa detik dari sesuatu?
IFS
tampaknya tidak biasa. Apakah Anda benar-benar ingin membagi pada backspace (\b
)? Lihat unix.stackexchange.com/questions/9496/… untuk beberapa tips.Jawaban:
stat's
output adalah cap waktu Unix, juga disebut detik sejak Zaman .Semua GNU coreutils yang menerima tanggal memungkinkan Anda untuk meletakkan stempel waktu sebagai ganti dengan awalan stempel waktu dengan
@
.Jadi coba ini
Lihat coreutils - Detik sejak zaman
sumber
touch
dapat menggunakan stempel waktu file menggunakan-r
opsi. Anda mungkin ingin menampilkan ke file yang berbeda (saya berasumsi di bawah-if
ini adalah file input dan-of
file output)sumber
stat
.Karena Anda mengasumsikan shell dengan
echo -e
, dan Anda memiliki bash di garis shebang Anda, Anda dapat menggunakannyaIFS=$'\n\b'
. Membuat backspace pemisah agak aneh. Anda tidak perluIFS
melakukan apa yang Anda lakukan.Perhatikan bahwa ini mengembalikan nilai lama
IFS
hanya jikaIFS
awalnya ditetapkan. JikaIFS
awalnya tidak disetel, ini disetIFS
ke string kosong, yang sama sekali berbeda. Di ksh, bash atau zsh, jika Anda perlu mengaturIFS
sementara, Anda dapat menulis kode Anda dalam suatu fungsi dan membuatIFS
lokal ke fungsi ini. Di shell lain, Anda perlu berhati-hati tentang kasus yang tidak disetel.Jangan pernah menggunakan substitusi perintah pada output dari
find
.$IFS
. Jika Anda mengaturIFS
ke baris baru, maka ini membagi output di baris baru, tetapi Anda masih tidak bisa menangani nama file yang mengandung baris baru.A[12].pdf
,A1.pdf
danA2.pdf
, Anda akan berakhir denganA1.pdf A2.pdf A1.pdf A2.pdf
. Anda dapat mematikan globbing denganset -f
(dan kembali denganset +f
), tetapi di sini (seperti kebanyakan waktu) cara yang tepat adalah tidak menggunakan substitusi perintah.Gunakan
-exec
argumen untukfind
(atau jika sistem Anda memiliki-print0
, Anda dapat menggunakanfind … -print0 | xargs -0 …
sebagai gantinya; ini hanya berguna untuk bertindak pada banyak file sekaligus jika Anda memerlukan portabilitas ke sistem Linux kuno atau sistem OpenBSD saat ini yang memiliki-print0
tetapi tidak-exec … {} +
).Perhatikan bahwa Anda kehilangan tanda kutip ganda di sekitar
$f
(mereka tidak diperlukan jika ini adalah hasil pemisahan dan Anda belum berubahIFS
sejak saat itu dan globbing dimatikan, tapi sungguh, selalu menempatkan tanda kutip ganda kecuali Anda tahu mengapa Anda bisa ' t biarkan mereka hidup).Ini kikuk dan non-portabel (
stat
tidak ada pada semua sistem, dan argumennya berbeda di berbagai sistem di mana ia ada).touch
memiliki opsi portabel untuk mengatur file ke timestamp dari file lain:touch -r REFERENCE_FILE FILE
. Saya akan merekomendasikan salah satu dari dua pendekatan:touch -r
untuk mengatur tanggal file baru, dan akhirnya pindahkan file baru ke tempatnya. Lebih baik untuk memastikan output baik-baik saja sebelum sesuatu terjadi pada input; jika tidak, jika transformasi terputus karena alasan apa pun (mis. kegagalan daya), Anda akan kehilangan data.touch -r
dua kali: sekali untuk menyimpan tanggal file asli pada file sementara yang kosong (yang akan dibuat secara otomatis), lalu sekali lagi setelah transformasi untuk mengembalikan tanggal. menggunakan file sementara.Jadi:
sumber
Untuk beberapa alasan saya melewatkan jawaban tentang
touch -r
; jika karena alasan yang aneh Anda tidak memiliki GNU coreutils 'stat
seperti dalam jawaban yang diterima atau tidak dapat digunakantouch -r
, berikut adalah cara untuk mendapatkan cap waktu dalamtouch
format ramah dengan BSD-likestat
.Tapi sungguh, cukup gunakan
touch -r
:sumber
Saya memiliki masalah yang sama, berasal dari proses pembuatan film.
Dalam contoh di bawah
orig_file.wav
ini adalah file dengan cap waktu asli, sedangkanprocessed_file.wav
file dengan konten yang sama, tetapi cap waktu salah.SEBELUM:
localhost $ ls -lh orig_file.wav processed_file.wav Jan 23 17:15 processed_file.wav Jul 9 2018 orig_file.wav
PERINTAH:
localhost $ touch -t $(date --date=@`stat -f%B orig_file.wav` +%Y%m%d%H%M.%S) processed_file.wav
SETELAH:
localhost $ ls -lh orig_file.wav processed_file.wav Jul 9 2018 processed_file.wav Jul 9 2018 orig_file.wav
CATATAN:
stat
dalam kutu terbalik memberi Anda cap waktu pembuatan file asli sebagai waktu unix epoch (dalam detik). @ Dari coreutils mengubahnya menjadi tanggal iso yangdate
dapat memahami dan memformat ulang dengan YYYYMMDDHHmm.SS sehinggatouch
dapat memahaminya. Saya menempatkandate
perintah ke $ (), sebagai yang setara dengan kutu terbalik, karena mereka tidak dapat digunakan kembali dalam perintah yang sama.sumber
touch -r
)? (2)stat
dapat dimasukkan ke dalam$(…)
; mereka dapat digunakan beberapa kali dalam satu perintah.