অনেকগুলি ফাইলে ট্যাবগুলিকে স্পেসে রূপান্তর করা


11

ট্যাবগুলি জুড়ে আমার কাছে প্রচুর ফাইল রয়েছে এবং আমি সেগুলি সমস্ত জায়গাতে রূপান্তর করতে চাই। আমি expandকমান্ডটি সম্পর্কে জানি , তবে দুর্ভাগ্যক্রমে আমাকে এটি ব্যবহার করে প্রতিটি ফাইল টাইপ করতে হবে। লিনাক্স এ করার কোন সহজ উপায় আছে?

উত্তর:


12

নিম্নলিখিত চেষ্টা করুন:

find ./ -type f -exec sed -i 's/\t/ /g' {} \;

আপনি যদি চারটি স্থান চান, চেষ্টা করুন:

find ./ -type f -exec sed -i 's/\t/    /g' {} \;

এটি প্রতিটি ট্যাবকে একক স্থান দ্বারা প্রতিস্থাপন করবে। যেহেতু ব্যক্তি ব্যবহারের কথা উল্লেখ করেছেন expand, আমি ধরে নিচ্ছি সে / র পাঠ্যটির প্রান্তিককরণ চায় wants
গ্যারিজহান

আপনাকে 's/\t/ /g'প্রতি লাইনে একাধিক ট্যাব প্রতিস্থাপন করতে হবে।
ড্যানিয়েল অ্যান্ডারসন

1
অনেকগুলি ফাইল থাকলে " find ./ -type f -exec sed -i ’s/\t/ /g’ {} +" (এটি "" +"এর পরিবর্তে" \;"করা) একটি যথেষ্ট গতিপথ , যদি findসংস্করণটি সমর্থন করে (এবং আমি ব্যক্তিগতভাবে এমন কোনও সংস্করণ মেলেনি যা নাও পজিক্স মান নয়) , সুতরাং আমি অনুমান করি যে এটি কিছু সিস্টেমে ঘটতে পারে -exec command {} +the "ম্যানুয়ালটিতে " " দেখুন )। sedপ্রতিটি ফাইলের জন্য একটি উদাহরণ চালু করার পরিবর্তে, এটি সিস্টেমের মতো ( getconf ARG_MAX= আমার সিস্টেমে = 2097152) যতটা ফাইল সমর্থন করে তত যুক্তিযুক্ত তালিকা তৈরি করবে xargsএবং এভাবে আরও কম sedপ্রক্রিয়া চালু করবে ।
ড্যানিয়েল অ্যান্ডারসন

6
যে কোনও ম্যাক ব্যবহারকারীরা sedএটির জন্য নোট করুন: ওএস এক্স এর সংস্করণটি \tট্যাব এস্কেপ ক্রমটি বুঝতে পারে না । আপনি এটি একটি আক্ষরিক ট্যাব চরিত্রের সাথে প্রতিস্থাপন করতে পারেন, যা আপনি শেলটি প্রবেশ করে [Ctrl]+V, [Tab]
জেরেমি ব্যাংকগুলি

expandসম্ভবত বেশী ভালো sed: যেমন ব্যাখ্যা এই জন্য, stackoverflow.com/a/11094620/131824
ডেভিড Weinraub

6

এটি করার প্রচুর উপায় রয়েছে। আপনি যত্নবান না হন বা আপনি যেমন লিনাক্সে নতুন হিসাবে দেখাচ্ছেন তেমন করার সময় এই কাজ করার সময় নিজেকে পায়ে গুলি করার অনেকগুলি উপায়ও রয়েছে। ধরে নিই যে আপনি যে ফাইলগুলির রূপান্তর করতে চান তার একটি তালিকা তৈরি করতে পারেন, হয় findসম্পাদকের সাহায্যে ম্যানুয়ালি কিছু ব্যবহার করে , কেবল সেই তালিকাটি নীচের অংশে পাইপ করুন।

while read file
do
   expand "$file" > /tmp/expandtmp
   mv /tmp/expandtmp "$file"
done

এর সাথে আপনি নিজের পাতে গুলি করতে পারেন একটি টাইপো তৈরি করা যাতে আপনি নিজের উল্লেখ করা সমস্ত ফাইলের নামের সাথে একটি খালি ফাইল মুভিং করে যান, যার ফলে আপনার সমস্ত ফাইলের সামগ্রী মুছে ফেলা যায়। সুতরাং সাবধানতা অবলম্বন করুন এবং আপনি যে ফাইলগুলি ব্যাক আপ করেছেন তার একটি ছোট সেটটিতে আপনি প্রথমে যা কিছু করেন তা পরীক্ষা করুন।


3
করুন mvসাফল্যের উপর শর্তাধীন expand:expand ... && mv ...
পরবর্তী ঘোষণা না হওয়া পর্যন্ত বিরাম দেওয়া।

expand -t 4ট্যাবগুলি 4 টি স্পেসে প্রসারিত করতে ভুলবেন না । এছাড়াও, এই পদ্ধতিটি পিছনে নতুন লাইনের তৈরি করতে পারে। তবে অন্যথায় এটি কাজ করে।
মিগল্ড

3
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo

-I foo প্রতিটি ইনপুট লাইনের জন্য একটি টেম্পলেট ভেরিয়েবল ফু তৈরি করে, যাতে আপনি একাধিকবার ইনপুটটি উল্লেখ করতে পারেন।

-print0এবং -0উভয় কমান্ডকে স্পেসের পরিবর্তে লাইন বিভাজক হিসাবে \ 0 ব্যবহার করতে বলুন, সুতরাং এই কমান্ডটি ফাঁকা স্থান সহ পাথের জন্য কাজ করে।


1
find -name \*.js -exec bash -c 'expand -t 4 "$0" | tee "$0"' {} \;

কনস:
পাইপ বাফার আকারের চেয়ে বড় ফাইলগুলি ( K৪ কেবি ) কেটে ফেলা হয়

পেশাদাররা: পাইপ বাফার আকারের চেয়ে বড়
কোনও টেম্প ফাইল
ফাইল কেটে যায় না


0

ইহা ভাল:

find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;

3
কেন এই ভাল? এটি ব্যবহার করা দুর্দান্ত ধারণা নয় /tmp/eকারণ যদি অন্য কোনও ফাইল সেই ফাইলটি ব্যবহার করে তবে তা এতে বিশৃঙ্খলা সৃষ্টি করবে। দুটি ব্যবহারকারী একই সাথে এটি ব্যবহার করতে চাইলে পছন্দ করুন।
কেভিন প্যাঙ্কো

0

নিম্নলিখিত সমস্যাগুলির কথা মাথায় রেখে আমি এই সমস্যাটি দিয়েছি:

  • কেবলমাত্র .cpp বা .json ফাইলের জন্য প্রক্রিয়া করতে তাদের নামের উপর ভিত্তি করে ফাইলগুলি ফিল্টার করুন
  • সমান্তরাল প্রক্রিয়াকরণ সমর্থন। যদি অনেকগুলি ফাইল থাকে তবে এটি একটি বিশাল গতিবেগ সরবরাহ করতে পারে
  • সমাধানটি সহজ ব্যবহারের জন্য এক লাইনে মাপসই করা উচিত

শেষের প্রয়োজনীয়তা পূরণ করা সবচেয়ে কঠিন ছিল কারণ "প্রসারিত" জায়গায় ফাইলগুলি সংশোধন করতে দেয় না।

আমি নিম্নলিখিত সমাধান নিয়ে এসেছি:

find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)'  -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'

এখানে কিছু ব্যাখ্যা:

  • প্রক্রিয়া করার জন্য "সন্ধান করুন" ফাইলগুলি সন্ধান করে। "-regextype egrep" তাদের নামের উপর ভিত্তি করে ফিল্টার করতে দেয় এবং "egrep" ফর্ম্যাটে একটি নিয়মিত অভিব্যক্তি
  • "-type f" প্যারামিটার নিশ্চিত করে যে আমরা কেবল নিয়মিত ফাইলের সাথে মিল করব, উদাহরণস্বরূপ ডিরেক্টরি বা বিশেষ কিছু নয়
  • "-regexp" পরামিতি হ'ল নিজেই নিয়মিত প্রকাশ, যা এক্ষেত্রে .c, .cpp, .h বা .hpp এর সাথে শেষ হওয়া কোনও ফাইলের সাথে মেলে (পুরো নামটির সাথে মিল থাকতে হবে, তাই "file.c2" না , যা আমরা চাই)
  • "-প্রিন্ট 0" প্রতিটি পাথের শেষে 0 অক্ষর দিয়ে স্ট্যান্ডার্ড আউটপুটটিতে ফাইল পাথগুলি মুদ্রণের জন্য "সন্ধান" নির্দেশ দেয়। "Xargs" এর জন্য "-0" বিকল্পের সাথে এটি এক সরঞ্জাম থেকে অন্য সরঞ্জামে রিটার্ন ক্যারিজেস যুক্ত নামগুলি পাস করার অনুমতি দেয় (এমনকি যদি এটি বেশ বিরল পরিস্থিতিও হয় ...)
  • xargs প্রতিটি পাথের জন্য একটি নতুন প্রক্রিয়া শুরু করে ("-n 1"), তবে সমান্তরালে ("-P 10") হিসাবে 10 টির মতো প্রসেস চালাতে পারে
  • xargs কমান্ডের প্রতিটি ফাইল পাথ পাস করার জন্য "ফাইল" নামটি ব্যবহার করে যা একটি বাশ স্ক্রিপ্ট
  • বাশ স্ক্রিপ্টটি "প্রসারিত" কল করে এবং অস্থায়ী ফাইলে ফলাফল সংরক্ষণ করে যার নামগুলিতে বর্তমান প্রক্রিয়া আইডি ($$) রয়েছে, যাতে প্রদত্ত ফাইলে সমান্তরালে চলমান সমস্ত প্রক্রিয়া বিভিন্ন অস্থায়ী ফাইল ব্যবহার করে
  • পুরো কমান্ডটি প্যাটার্নটি ব্যবহার করে (কমান্ড 1 && কমান্ড 2 && কমান্ড 3) যাতে প্রক্রিয়াটি বন্ধ হয়ে যায় যদি কোনও সাবকম্যান্ড ত্রুটি ফেরায় তবে
  • পূর্ববর্তী "&&" শৃঙ্খলা থেকে যদি কোনও ত্রুটি থেকে থাকে তবে ব্যাশ স্ক্রিপ্টটি একটি প্রস্থান কোড 255 ফিরিয়ে দেবে যা জার্গগুলি অবিলম্বে বন্ধ করে দেবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.