ফাইলগুলির প্রথম এন বাইট মুছুন


32

আমি একটি চরম সমস্যা পেয়েছি, এবং আমি যে সমাধানগুলি কল্পনা করতে পারি তার সবগুলি জটিল। আমার ইউনিক্স / লিনাক্স অভিজ্ঞতা অনুযায়ী একটি সহজ উপায় থাকতে হবে।

আমি প্রতিটি ফাইলের প্রথম 31 বাইট মুছতে চাই /foo/। প্রতিটি ফাইল যথেষ্ট দীর্ঘ। ঠিক আছে, আমি নিশ্চিত যে কেউ আমাকে একটি চমকপ্রদ সহজ সমাধান প্রদান করবেন যা আমি কল্পনাও করতে পারি না। অজানা?


2
যেকোনও অ্যাজ / সিড / এডি সমাধান লাইন-ওরিয়েন্টেড হবে, তাই যদি আপনি না জানেন তবে প্রথম লাইনটি কমপক্ষে 31 টি অক্ষর হবে তবে জটিলতা দেখা দেয়।
গ্লেন জ্যাকম্যান

উত্তর:


28
for file in /foo/*
do
  if [ -f "$file" ]
  then
    dd if="$file" of="$file.truncated" bs=31 skip=1 && mv "$file.truncated" "$file"
  fi
done

বা দ্রুততর, গিলসের পরামর্শের জন্য ধন্যবাদ:

for file in /foo/*
    do
      if [ -f $file ]
      then
        tail +32c $file > $file.truncated && mv $file.truncated $file
      fi
    done

দ্রষ্টব্য: পজিক্স লেজ "+ 32c" এর পরিবর্তে "-c +32" নির্দিষ্ট করে তবে সোলারিসের ডিফল্ট লেজটি এটি পছন্দ করে না:

   $ /usr/bin/tail -c +32 /tmp/foo > /tmp/foo1
    tail: cannot open input

/usr/xpg4/bin/tail উভয় বাক্য গঠন সঙ্গে ঠিক আছে।


1
ddএখানে পরামর্শ দেওয়া ওভারকিল, tailআরও উপযুক্ত (সহজ, হত্যাকারী টাইপোর ঝুঁকি কম, স্ট্যাডারে কোনও উত্সাহিত বার্তা নেই)।
গিলস 'অশুভ হওয়া বন্ধ করুন' ২:16

তুমি ঠিক. আমি সাধারণত বাইনারিগুলির প্রক্রিয়া করার সময় পাঠ্য ফাইলগুলি প্রক্রিয়াকরণের উদ্দেশ্যে আদেশগুলি এড়াতে পারি তবে "লেজ +32 সি" এখানে কাজ করবে।
jlliagre

1
@ জেলিয়াগ্রে: আপনি লিখেছেন cut (যে লেজটি হওয়া উচিত নয়? ... অ্যাসিস, এটি আমার পক্ষে কাজ করে না ...
পিটার.ও

অবশ্যই, এটি লেজ। অমিল সম্পর্কে দুঃখিত।
jlliagre

@jlliagre: সোলারিস, আপনি থাকা উচিত /usr/xpg4/binএগিয়ে /usr/binআপনার এর উপর PATH, অথবা আপনি 1990 আটকে থাকব। অনেকগুলি ইউনিসে (যেমন জিএনইউ, ব্যজিবক্স) historicalতিহাসিক বাক্য গঠনটি আর সমর্থন করে না +32cএবং এটি ফাইল +32cহিসাবে বোঝায় (যেমন পসিক্সের প্রয়োজন)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

12

নিম্নলিখিত আদেশগুলি থেকে 31 টি বাইট কেটে দেওয়া হয়েছে $file( $file~একটি টেম্পের কপি হিসাবে ব্যবহার করে ):

dd if="$file" of="$file~" bs=1 skip=31
mv "$file~" "$file"

আপনার কেবলমাত্র findনীচে বা সমস্ত ফাইল তালিকাভুক্ত করতে হবে /foo/এবং প্রতিটি প্রাপ্তির জন্য উপরের দুটিটিকে সম্পাদন করতে হবে $file


1
বিএস অদলবদল এবং মানগুলি এড়িয়ে যাওয়া কর্মক্ষমতা বাড়িয়ে তুলবে।
jlliagre

10

tail -c +32এর ইনপুট বিয়োগ প্রথম 31 বাইট আউটপুট করে। (হ্যাঁ, যুক্তি এক সাথে বন্ধ রয়েছে)) জায়গাটিতে কোনও ফাইল সম্পাদনা করতে, একটি লুপে স্পঞ্জ ব্যবহার করুন , বা যদি আপনার এটি না থাকে এবং বিরক্ত করতে না চান তবে শেলটিতে তার কাজটি করুন:

for x in /foo/*; do tail -c +32 "$x" | sponge "$x"; done
for x in /foo/*; do tail -c +32 "$x" >"$x.new" && mv "$x.new" "$x"; done

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

mkdir /foo.tmp
cd /foo
for x in *; do tail -c +42 -- "$x" >"/foo.tmp/$x" && rm -- "$x"; done
mv /foo.tmp/* /foo
rmdir /foo.tmp

যদি ফাইলগুলি সত্যিই বড় হয় (যেমন যথেষ্ট পরিমাণে যে একক দুটি কপি থাকাও সমস্যা) তবে আপনি এই থ্রেডে উল্লিখিত একটি কৌশল ব্যবহার করতে পারেন ।


2

আপনি প্রাক্তন মোডে ভিম ব্যবহার করতে পারেন:

for each in /foo/*
do
  ex -sc '%!tail -c+32' -cx "$each"
done
  1. % সমস্ত লাইন নির্বাচন করুন

  2. ! আপনার আদেশ প্রদান করুন

  3. x সংরক্ষণ করেন এবং বন্ধ করেন

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