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"' {} \;
IFSঅস্বাভাবিক বলে মনে হচ্ছে। আপনি কি সত্যিই ব্যাকস্পেসে বিভক্ত করতে চান (\b)? কিছু টিপসের জন্য unix.stackexchange.com/questions/9496/… দেখুন ।