স্পর্শ জন্য টাইমস্ট্যাম্প প্রদান স্ট্যাট ব্যবহার


11

আমি কিছু নথি ওসিআর করার চেষ্টা করছি (উইন্ডোজ শেয়ারের লিনাক্স কমান্ড লাইন থেকে)। ওসিআরিংয়ের প্রক্রিয়াটি সন্ধান করা হয়েছে এবং লুপটির মাধ্যমে ফাইলগুলি সঠিকভাবে পাইপ করার জন্য ফাইন্ড কমান্ডটি ব্যবহার করে আমি বিভ্রান্ত হয়েছি।

তবে আমি পরিবর্তিত জন্য মূল টাইমস্ট্যাম্প সংরক্ষণ করা প্রয়োজন। আমি বর্তমানে নীচে হিসাবে স্ট্যাট এবং স্পর্শ ব্যবহার করার চেষ্টা করছি:

#!/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

অবশ্যই টাচ কমান্ড ব্যর্থ হয়। কমান্ডগুলি পৃথকভাবে চালানো আমি লক্ষ্য করি "স্ট্যাটাস-সি" এর লাইন বরাবর এমন কিছু:

1334758696

যা আমি জানি না তারিখের মতো। আমি মনে করি যেন আমি নিকটে আছি তবে কীভাবে আমার তারিখটি একটি স্পর্শ বান্ধব সংস্করণে রূপান্তর করা যায় তা কার্যকর করতে পারছি না। এটি কি কিছু থেকে সেকেন্ডের কিছু ফর্ম?


পাশাপাশি: আপনার ব্যবহার IFSঅস্বাভাবিক বলে মনে হচ্ছে। আপনি কি সত্যিই ব্যাকস্পেসে বিভক্ত করতে চান ( \b)? কিছু টিপসের জন্য unix.stackexchange.com/questions/9496/… দেখুন ।
মাইকেল

উত্তর:


17

stat'sআউটপুট হ'ল একটি ইউনিক্স টাইমস্ট্যাম্প, এটিকে পর্বের সময় থেকে কয়েক সেকেন্ডও বলা হয় ।

যে সমস্ত জিএনইউ কোর্টিলগুলি একটি তারিখ গ্রহণ করে সেগুলি আপনাকে টাইমস্ট্যাম্পের সাথে একটিের সাথে উপস্থাপনের পরিবর্তে একটি টাইমস্ট্যাম্প লাগাতে দেয় @

সুতরাং এটি চেষ্টা করুন

touch -d @$ORIGTS $f

যুগের পর থেকে কোর্টিল - সেকেন্ড দেখুন


আহ যে এখন লিনাক্সে দেখেছি অনেক টাইমস্ট্যাম্প ব্যাখ্যা করে! অনেক ধন্যবাদ
টিম আলেকজান্ডার

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এবং আপনার শেবাং লাইনে যে কোনও উপায়ে বাশ রয়েছে তাই আপনি ব্যবহার করতে পারেন IFS=$'\n\b'। ব্যাকস্পেসকে পৃথককারী করা বরং অদ্ভুত। 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। আপনি set -f(এবং সাথে ফিরে ফিরে set +f) দিয়ে গ্লোববিং বন্ধ করতে পারেন , তবে এখানে (বেশিরভাগ সময়ের মতো) সঠিক উপায় হ'ল কমান্ড প্রতিস্থাপন ব্যবহার করা নয়।

-execআর্গুমেন্টটি ব্যবহার করুন find(বা যদি আপনার সিস্টেমে থাকে তবে -print0আপনি এর find … -print0 | xargs -0 …পরিবর্তে ব্যবহার করতে পারেন ; প্রাচীন লিনাক্স সিস্টেম বা বর্তমান ওপেনবিএসডি সিস্টেমে যেগুলি -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; যদি কোনও অদ্ভুত কারণে আপনার statকাছে গ্রহণযোগ্য উত্তরের মতো জিএনইউ কোর্টিলগুলি না থাকে বা ব্যবহার করতে না পারেন touch -rতবে touchবিএসডি-এর মতো টাইমস্ট্যাম্পটি বন্ধুত্বপূর্ণ বিন্যাসে কীভাবে পাবেন তা এখানে রয়েছে stat

% /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

মন্তব্য:

statইনভার্টেড টিক্স আপনাকে ইউনিক্স যুগের সময় (সেকেন্ডে) হিসাবে মূল ফাইলটির তৈরি টাইমস্ট্যাম্প দেয়। কৌরটিল থেকে @ এটিকে একটি আইএসও তারিখে রূপান্তরিত করে dateযা YYYYMMDDHHmm.SS- র সাথে বুঝতে এবং পুনরায় ফর্ম্যাট touchকরতে পারে যাতে এটি বুঝতে পারে। আমি dateউল্টানো টিক্সের সমতুল্য হিসাবে কমান্ডটি $ () তে রেখেছি , কারণ সেগুলি একই কমান্ডে পুনরায় ব্যবহার করা যাবে না।


(1) এটি নিকোলাস রিলির উত্তরের মতো প্রায় হুবহু তবে আরও জটিল। কেন কেউ এর পরিবর্তে এটি ব্যবহার করতে চাইবে (বা, আরও ভাল, গ্লেন জ্যাকম্যানের উত্তর , ব্যবহার করে touch -r)? (2)  stat beোকানো যেতে পারে $(…); এগুলি এক কমান্ডে একাধিকবার ব্যবহার করা যায়।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল মনিকা'

সময় তৈরির পরিবর্তে পরিবর্তনের সময় ব্যবহার করে তাঁর উত্তর ছাড়া অন্যটি, আপনি সঠিক বলে মনে করছেন। আমি এই অন্য উত্তর লক্ষ্য করিনি। আপনি আমার ভোট ডাউন করতে পারেন।
ডেমোকিকজ

ঠিক আছে, যদি আপনি আমাকে জিজ্ঞাসা করেন, এটি মজাদার নয়। :-) ⁠
জি-ম্যান বলেছেন 'পুনরায় ইনস্টল মনিকা'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.