আমি কীভাবে ডিরেক্টরিগুলির প্রতিটি ফাইলের (সম্ভবত পুনরাবৃত্তভাবে) ট্যাবগুলিকে স্পেসে রূপান্তর করতে পারি?
এছাড়াও, ট্যাব প্রতি স্পেস সংখ্যা নির্ধারণ করার কোন উপায় আছে?
pr
এটির জন্য একটি দুর্দান্ত উপযোগিতা। এই উত্তর দেখুন ।
আমি কীভাবে ডিরেক্টরিগুলির প্রতিটি ফাইলের (সম্ভবত পুনরাবৃত্তভাবে) ট্যাবগুলিকে স্পেসে রূপান্তর করতে পারি?
এছাড়াও, ট্যাব প্রতি স্পেস সংখ্যা নির্ধারণ করার কোন উপায় আছে?
pr
এটির জন্য একটি দুর্দান্ত উপযোগিতা। এই উত্তর দেখুন ।
উত্তর:
সতর্কতা: এটি আপনার রেপো ভেঙে দেবে।
এই দুর্নীতিগ্রস্ত বাইনারি ফাইল হবে ঐ অধীনে সহ
svn
,.git
! ব্যবহার করার আগে মন্তব্য পড়ুন!
find . -iname '*.java' -type f -exec sed -i.orig 's/\t/ /g' {} +
মূল ফাইল হিসাবে সংরক্ষণ করা হয় [filename].orig
।
আপনি যে ফাইল ধরণের সন্ধান করছেন তাতে ফাইলের সমাপ্তির সাথে '*। জাভা' প্রতিস্থাপন করুন। এইভাবে আপনি বাইনারি ফাইলগুলির দুর্ঘটনাকবলিত দুর্নীতি রোধ করতে পারেন।
downsides:
expand
।
find ./ -type f -exec sed -i 's/^\t/####/g' {} \;
। তবে আমি প্রসারিত কমান্ড সম্পর্কে সচেতন ছিলাম না - খুব দরকারী!
এর সাথে সরল প্রতিস্থাপন sed
ঠিক আছে তবে সর্বোত্তম সম্ভাব্য সমাধান নয়। ট্যাবগুলির মধ্যে যদি "অতিরিক্ত" স্পেস থাকে তবে তারা প্রতিস্থাপনের পরেও সেখানে থাকবে, সুতরাং মার্জিনগুলি র্যাগ হবে। লাইনের মাঝখানে প্রসারিত ট্যাবগুলিও সঠিকভাবে কাজ করবে না। ইন bash
, আমরা পরিবর্তে বলতে পারেন
find . -name '*.java' ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
expand
বর্তমান ডিরেক্টরি গাছের প্রতিটি জাভা ফাইলের জন্য প্রয়োগ করতে। -name
আপনি যদি অন্য কোনও ফাইলের ধরণের লক্ষ্যবস্তু করে থাকেন তবে যুক্তিটি সরান / প্রতিস্থাপন করুন । মন্তব্যের মধ্যে একটির হিসাবে উল্লেখ করা হয়েছে, -name
দুর্বল, ওয়াইল্ডকার্ড অপসারণ বা ব্যবহার করার সময় খুব সতর্কতা অবলম্বন করুন । আপনি সহজেই ইচ্ছাকৃত ছাড়াই ক্লোবার সংগ্রহস্থল এবং অন্যান্য লুকানো ফাইলগুলি করতে পারেন। এই কারণেই মূল উত্তরটি এতে অন্তর্ভুক্ত করেছে:
আপনার যদি কিছু সমস্যা হয়ে যায় তবে এই জাতীয় কিছু চেষ্টা করার আগে আপনার সর্বদা গাছের একটি ব্যাকআপ কপি তৈরি করা উচিত।
{}
। দেখে মনে হচ্ছে $0
কখন -c
সে ব্যবহৃত হয় সে সম্পর্কে তিনি জানতেন না । তারপরে ডিমেও 414 আমার রূপান্তর ডিরেক্টরিতে একটি টেম্পের ব্যবহার থেকে পরিবর্তিত হয়েছে /tmp
, যা /tmp
কোনও ভিন্ন মাউন্ট পয়েন্টে থাকলে খুব ধীর হবে । দুর্ভাগ্যক্রমে আপনার $0
প্রস্তাব পরীক্ষা করার জন্য আমার কাছে লিনাক্স বক্স নেই । তবে আমি আপনাকে সঠিক বলে মনে করি।
find . -name '*.java' ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
sponge
থেকে joeyh.name/code/moreutils , আপনি লিখতে পারেনfind . -name '*.py' ! -type d -exec bash -c 'expand -t 8 "$0" | sponge "$0"' {} \;
find . -name '*'
, আমি আমার স্থানীয় গিট রেপোটি ধ্বংস করেছি
কমান্ড লাইন সরঞ্জাম ব্যবহার করে দেখুন expand
।
expand -i -t 4 input | sponge output
কোথায়
-i
প্রতিটি লাইনে কেবল শীর্ষস্থানীয় ট্যাবগুলি প্রসারণ করতে ব্যবহৃত হয়;-t 4
এর অর্থ হ'ল প্রতিটি ট্যাব 4 টি সাদা স্পেস অক্ষরে রূপান্তরিত হবে (8 ডিফল্টরূপে)।sponge
এটি moreutils
প্যাকেজ থেকে রয়েছে এবং ইনপুট ফাইল সাফ করা এড়িয়ে চলে ।অবশেষে, আপনি হোমব্রিউ ( ) দিয়ে gexpand
ইনস্টল করার পরে, ওএসএক্সে ব্যবহার করতে পারেন ।coreutils
brew install coreutils
-i
করতে expand
হবে। এটি কোডের অংশ হতে পারে এমন ট্যাবগুলি প্রতিস্থাপন এড়াতে সহায়তা করে।
input
মতো একই ফাইলটি output
শুরু করার আগেও বিষয়বস্তুতে থাকে expand
। এভাবেই >
কাজ করে।
জিনের উত্তর থেকে সর্বোত্তম মন্তব্য সংগ্রহ করা , এখন পর্যন্ত সর্বোত্তম সমাধান, মুর্টিলsponge
থেকে ব্যবহার করা ।
sudo apt-get install moreutils
# The complete one-liner:
find ./ -iname '*.java' -type f -exec bash -c 'expand -t 4 "$0" | sponge "$0"' {} \;
ব্যাখ্যা:
./
পুনরাবৃত্তভাবে বর্তমান ডিরেক্টরি থেকে অনুসন্ধান করা হয়-iname
এটি একটি সংবেদনশীল ম্যাচ (উভয় *.java
এবং *.JAVA
পছন্দ উভয়ের জন্য )type -f
কেবল নিয়মিত ফাইল খুঁজে পাওয়া যায় (কোনও ডিরেক্টরি, বাইনারি বা সিমলিংক নেই)-exec bash -c
প্রতিটি ফাইলের নামের জন্য একটি সাবশেলে নিম্নলিখিত কমান্ডগুলি কার্যকর করে, {}
expand -t 4
সমস্ত টিএবিগুলি 4 টি স্পেসে প্রসারিত করেsponge
স্ট্যান্ডার্ড ইনপুট ভিজিয়ে নিন (থেকে expand
) এবং কোনও ফাইলে লিখুন (একইটি ) *।দ্রষ্টব্য : * একটি সাধারণ ফাইল পুনর্নির্দেশ ( > "$0"
) এখানে কাজ করবে না কারণ এটি খুব শীঘ্রই ফাইলটিকে ওভাররাইট করে দেবে ।
সুবিধা : সমস্ত মূল ফাইলের অনুমতি ধরে রাখা হয় এবং কোনও মধ্যবর্তী tmp
ফাইল ব্যবহার করা হয় না।
ব্যাকস্ল্যাশ-পলায়ন ব্যবহার করুন sed
।
লিনাক্সে:
সমস্ত * .txt ফাইলগুলিতে 1 টি হাইফেন অন্তর্ভুক্তের সাথে সমস্ত ট্যাব প্রতিস্থাপন করুন:
sed -i $'s/\t/-/g' *.txt
সমস্ত * .txt ফাইলগুলিতে 1 টি স্থানের স্থান সহ সমস্ত ট্যাব প্রতিস্থাপন করুন:
sed -i $'s/\t/ /g' *.txt
সমস্ত * .txt ফাইলগুলিতে 4 টি স্পেসের সাথে সমস্ত ট্যাব প্রতিস্থাপন করুন:
sed -i $'s/\t/ /g' *.txt
একটি ম্যাকে:
সমস্ত * .txt ফাইলগুলিতে 4 টি স্পেসের সাথে সমস্ত ট্যাব প্রতিস্থাপন করুন:
sed -i '' $'s/\t/ /g' *.txt
sed -i '' $'s/\t/ /g' $(find . -name "*.txt")
আপনি সাধারণত উপলব্ধ pr
কমান্ড ব্যবহার করতে পারেন (ম্যান পেজ এখানে )। উদাহরণস্বরূপ, ট্যাবগুলিকে চারটি স্পেসে রূপান্তর করতে, এটি করুন:
pr -t -e=4 file > file.expanded
-t
শিরোনাম দমন-e=num
ট্যাবগুলিকে num
স্পেসে প্রসারিত করেবাইনারি ফাইলগুলি এড়িয়ে যাওয়ার সময় ডিরেক্টরি ট্রিতে সমস্ত ফাইলকে পুনরাবৃত্তভাবে রূপান্তর করতে:
#!/bin/bash
num=4
shopt -s globstar nullglob
for f in **/*; do
[[ -f "$f" ]] || continue # skip if not a regular file
! grep -qI "$f" && continue # skip binary files
pr -t -e=$num "$f" > "$f.expanded.$$" && mv "$f.expanded.$$" "$f"
done
বাইনারি ফাইলগুলি এড়িয়ে যাওয়ার যুক্তি এই পোস্ট থেকে ।
বিঃদ্রঃ:
expand
উভয় POSIX হয় যে দেওয়া কোনও সুবিধা ? উদাহরণস্বরূপ এটির একটি ইনলাইন পরিবর্তন বিকল্প রয়েছে? এ git নিরাপত্তা: stackoverflow.com/a/52136507/895245
আমি কীভাবে ডিরেক্টরিগুলির প্রতিটি ফাইলের (সম্ভবত পুনরাবৃত্তভাবে) ট্যাবগুলিকে স্পেসে রূপান্তর করতে পারি?
এটি সাধারণত যা চান তা নয় ।
আপনি কি পিএনজি চিত্রগুলির জন্য এটি করতে চান? পিডিএফ ফাইল? .Git ডিরেক্টরি? আপনার
Makefile
(যা ট্যাব প্রয়োজন )? একটি 5 জিবি এসকিউএল ডাম্প?
আপনি, তাত্ত্বিকভাবে, find
আপনি ব্যবহার করছেন বা অন্য যে কোনও কিছুতে বহিষ্কার বিকল্পগুলি পুরোপুরি পাস করতে পারেন; তবে এটি ভঙ্গুর এবং অন্যান্য বাইনারি ফাইল যুক্ত করার সাথে সাথেই এটি ভেঙে যাবে।
আপনি যা চান তা অন্তত:
expand
করে, এটি sed
করে না)।আমি যতদূর জানি, এমন কোনও "স্ট্যান্ডার্ড" ইউনিক্স ইউটিলিটি নেই যা এটি করতে পারে এবং শেল ওয়ান-লাইনারের সাথে এটি করা খুব সহজ নয়, সুতরাং স্ক্রিপ্টের প্রয়োজন।
কিছুক্ষণ আগে আমি স্যানিটাইজ_ফায়ালস নামে একটি ছোট স্ক্রিপ্ট তৈরি করেছি
যা ঠিক এটি করে। এটি প্রতিস্থাপন \r\n
করা \n
, একটি ট্রেলিং যোগ করা \n
ইত্যাদির মতো কিছু সাধারণ জিনিসও ঠিক করে
নীচের অতিরিক্ত বৈশিষ্ট্য এবং কমান্ড-লাইন আর্গুমেন্ট ছাড়াই আপনি একটি সরলীকৃত স্ক্রিপ্টটি পেতে পারেন , তবে আমি আপনাকে প্রস্তাব দিচ্ছি যে আপনি উপরের স্ক্রিপ্টটি ব্যবহার করুন কারণ এটি পোস্টের চেয়ে বাগফিক্স এবং অন্যান্য আপডেট প্রাপ্তির সম্ভাবনা বেশি।
আমি এখানে অন্য কয়েকটি প্রশ্নের জবাবে এগুলিও উল্লেখ করতে চাই যে শেল গ্লোব্বিং ব্যবহার করা এটি করার একটি শক্তিশালী উপায় নয় , কারণ শীঘ্রই বা পরে আপনি আরও উপযুক্ত ফাইলগুলির সাথে শেষ হবেন ARG_MAX
(আধুনিক হিসাবে লিনাক্স সিস্টেমগুলি এটি 128 কে, যা অনেকটা মনে হতে পারে তবে তাড়াতাড়ি বা পরে এটি
পর্যাপ্ত নয় )।
#!/usr/bin/env python
#
# http://code.arp242.net/sanitize_files
#
import os, re, sys
def is_binary(data):
return data.find(b'\000') >= 0
def should_ignore(path):
keep = [
# VCS systems
'.git/', '.hg/' '.svn/' 'CVS/',
# These files have significant whitespace/tabs, and cannot be edited
# safely
# TODO: there are probably more of these files..
'Makefile', 'BSDmakefile', 'GNUmakefile', 'Gemfile.lock'
]
for k in keep:
if '/%s' % k in path:
return True
return False
def run(files):
indent_find = b'\t'
indent_replace = b' ' * indent_width
for f in files:
if should_ignore(f):
print('Ignoring %s' % f)
continue
try:
size = os.stat(f).st_size
# Unresolvable symlink, just ignore those
except FileNotFoundError as exc:
print('%s is unresolvable, skipping (%s)' % (f, exc))
continue
if size == 0: continue
if size > 1024 ** 2:
print("Skipping `%s' because it's over 1MiB" % f)
continue
try:
data = open(f, 'rb').read()
except (OSError, PermissionError) as exc:
print("Error: Unable to read `%s': %s" % (f, exc))
continue
if is_binary(data):
print("Skipping `%s' because it looks binary" % f)
continue
data = data.split(b'\n')
fixed_indent = False
for i, line in enumerate(data):
# Fix indentation
repl_count = 0
while line.startswith(indent_find):
fixed_indent = True
repl_count += 1
line = line.replace(indent_find, b'', 1)
if repl_count > 0:
line = indent_replace * repl_count + line
data = list(filter(lambda x: x is not None, data))
try:
open(f, 'wb').write(b'\n'.join(data))
except (OSError, PermissionError) as exc:
print("Error: Unable to write to `%s': %s" % (f, exc))
if __name__ == '__main__':
allfiles = []
for root, dirs, files in os.walk(os.getcwd()):
for f in files:
p = '%s/%s' % (root, f)
if do_add:
allfiles.append(p)
run(allfiles)
পুনরাবৃত্তাকারী অ্যাপ্লিকেশনটির জন্য উপরে "সন্ধান করুন" উদাহরণটি আমার পছন্দ হয়েছে এটিকে পুনরাবৃত্তিযোগ্য হিসাবে মানিয়ে নিতে, কেবল বর্তমান ডিরেক্টরিতে ফাইলগুলি পরিবর্তন করা যা একটি ওয়াইল্ডকার্ডের সাথে মেলে, শেল গ্লোব সম্প্রসারণ খুব অল্প পরিমাণে ফাইলের জন্য পর্যাপ্ত হতে পারে:
ls *.java | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh -v
আপনি এটা নীরব চান আপনি বিশ্বাস পর যে এটি কাজ করে, শুধু ড্রপ -v
উপর sh
শেষে কমান্ড।
অবশ্যই আপনি প্রথম কমান্ডে ফাইলের যে কোনও সেট বাছাই করতে পারেন। উদাহরণস্বরূপ, নিয়ন্ত্রিত উপায়ে কেবলমাত্র একটি নির্দিষ্ট উপ-ডিরেক্টরি (বা ডিরেক্টরিগুলি) তালিকাভুক্ত করুন:
ls mod/*/*.php | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
বা ঘন ঘন কিছু গভীরতার প্যারামিটার ইত্যাদির সাথে (1) চালান:
find mod/ -name '*.php' -mindepth 1 -maxdepth 2 | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
ARG_MAX
দৈর্ঘ্যের হতে পারে । এটি লিনাক্স সিস্টেমে 128 কে, তবে শেল গ্লোব্বিংয়ের উপর নির্ভর না করার জন্য আমি এই সীমাটি পর্যাপ্ত সময় সহ্য করেছি।
find
বলা যেতে পারে -maxdepth 1
, এবং এটি কেবলমাত্র ডাইরেক্টরির এন্ট্রিগুলি সংশোধন করার প্রক্রিয়াজাত করে, পুরো গাছটি নয়।
যে কেউ এর vim
জন্য ব্যবহার করতে পারেন :
find -type f \( -name '*.css' -o -name '*.html' -o -name '*.js' -o -name '*.php' \) -execdir vim -c retab -c wq {} \;
কার্পেটস্মোকার যেমন বলেছে, এটি আপনার vim
সেটিংস অনুসারে পুনরায় চালু করবে । এবং ফাইলগুলির মধ্যে মডেলাইনগুলি, যদি থাকে। এছাড়াও, এটি কেবলমাত্র লাইনের শুরুতে ট্যাবগুলি প্রতিস্থাপন করবে। আপনি সাধারণত যা চান তা নয়। উদাহরণস্বরূপ, আপনি ট্যাবগুলি সহ আক্ষরিক থাকতে পারে।
:retab
কোনও ফাইলের সমস্ত ট্যাব পরিবর্তন করবে, শুরুতে নয়। এটি আপনার :tabstop
এবং :expandtab
সেটিংস ভিআইএমআরসি বা মডেলিনে কী রয়েছে তার উপরও নির্ভর করে , সুতরাং এটি মোটেও কাজ করতে পারে না।
tabstop
এবং expandtab
সেটিংস হিসাবে , এটি ব্যবহার করে যদি এটি কাজ করে vim
। আপনার ফাইলগুলিতে মোড লাইন না থাকলে।
আমার প্রস্তাবটি ব্যবহার করা হয়:
find . -name '*.lua' -exec ex '+%s/\t/ /g' -cwq {} \;
মন্তব্যসমূহ:
sed
একটি স্ট্রিম সম্পাদক is ex
স্থান সম্পাদনে ব্যবহার করুন । এটি শীর্ষস্থানীয় উত্তরের মতো প্রতিটি প্রতিস্থাপনের জন্য অতিরিক্ত টেম্প ফাইল এবং স্পোলিং শেলগুলি এড়িয়ে চলে ।find|xargs
পরিবর্তে পরিবর্তে ব্যবহৃত এই উত্তরটির পূর্ববর্তী সংস্করণ find -exec
। @ Gniourf-gniourf দ্বারা নির্দেশিত হিসাবে এটি ফাইলের নাম সিএফ-এ স্পেস, কোট এবং নিয়ন্ত্রণ অক্ষরের সাথে সমস্যা সৃষ্টি করে। হুইলার ।ex
প্রতিটি ইউনিক্স সিস্টেমে নাও পাওয়া যেতে পারে। এটির সাথে বিকল্পটি vi -e
আরও মেশিনে কাজ করতে পারে। এছাড়াও, আপনার রেজেক্স দুটি শূন্যস্থান সহ যে কোনও সংখ্যক শুরুর ট্যাব অক্ষরকে প্রতিস্থাপন করে। +%s/\t/ /g
মাল্টি লেভেল ইনডেন্টেশন বিনষ্ট না করে দিয়ে রেজেক্সটি প্রতিস্থাপন করুন । তবে এটি ট্যাব অক্ষরগুলিকেও প্রভাবিত করে যা ইনডেন্টেশনের জন্য ব্যবহৃত হয় না।
/\t/ /
আমার ফাইলগুলিতে ভেরিয়েন্টটি ব্যবহার করেছিলাম, তবে /\t\+//
নন-ইনডেন্টিং ট্যাবগুলি না ভাঙ্গার জন্য বেছে নিয়েছি । মাল্টি-ইনডেন্টেশন দিয়ে মিস করেছেন! উত্তর আপডেট করা হচ্ছে। [1] man7.org/linux/man-pages/man1/ex.1p.html#SEE%C2%A0ALSO
xargs
এই উপায়ে ব্যবহার করা অকেজো, অদক্ষ এবং ভাঙ্গা (ফাঁকা জায়গা বা উদ্ধৃতি সম্বলিত ফাইলের নামগুলি ভাবেন)। আপনি পরিবর্তে find
এর -exec
সুইচ ব্যবহার করবেন না কেন ?
-print0
বিকল্পগুলি সন্ধান / জার্গার্স। আমি -exec
যেহেতু xargs পছন্দ করি : ক) উদ্বেগের বিচ্ছেদ বি) এটি আরও সহজেই জিএনইউ সমান্তরাল দিয়ে অদলবদল করা যেতে পারে।
একটি ট্যাব এর পরিবর্তে 4 টি স্পেস ব্যবহার করতে ডিরেক্টরিতে সমস্ত জাভা ফাইলকে পুনরাবৃত্তভাবে রূপান্তর করতে:
find . -type f -name *.java -exec bash -c 'expand -t 4 {} > /tmp/stuff;mv /tmp/stuff {}' \;
আপনি ব্যবহার করতে পারেন find
সঙ্গে tabs-to-spaces
এই জন্য প্যাকেজ।
প্রথমে ইনস্টল করুন tabs-to-spaces
npm install -g tabs-to-spaces
তারপরে, আপনার প্রকল্পের মূল ডিরেক্টরি থেকে এই কমান্ডটি চালান;
find . -name '*' -exec t2s --spaces 2 {} \;
এটি প্রতি ফাইলগুলিতে প্রতিটি tab
চরিত্রকে 2 দিয়ে প্রতিস্থাপন করবে spaces
।
দেহের উল্লেখ নেই rpl
? আরপিএল ব্যবহার করে আপনি যে কোনও স্ট্রিং প্রতিস্থাপন করতে পারেন। ট্যাবগুলিকে স্পেসে রূপান্তর করতে,
rpl -R -e "\t" " " .
খুব সহজ.
expand
অন্যান্য উত্তরে প্রস্তাবিত হিসাবে ব্যবহারটি একা এই কাজের জন্য সবচেয়ে যুক্তিসঙ্গত পন্থা বলে মনে হচ্ছে।
এটি বলেছে, আপনি যদি এর সাথে আরও কিছু পরিবর্তন করতে চান তবে এটি বাশ এবং আউক এর সাথেও করা যেতে পারে।
যদি ব্যাশ ৪.০ বা তার বেশি ব্যবহার করে, তবে বিল্ট শপটি globstar
পুনরাবৃত্তভাবে অনুসন্ধান করতে ব্যবহৃত হতে পারে **
।
জিএনইউ আওক সংস্করণ ৪.১ বা ততোধিক সংস্করণের সাথে "ইনপ্লেস" ফাইলের পরিবর্তনগুলি তৈরি করা যেতে পারে:
shopt -s globstar
gawk -i inplace '{gsub("\t"," ")}1' **/*.ext
আপনি যদি প্রতি ট্যাবে স্পেসের সংখ্যা নির্ধারণ করতে চান:
gawk -i inplace -v n=4 'BEGIN{for(i=1;i<=n;i++) c=c" "}{gsub("\t",c)}1' **/*.ext
প্লেইন টেক্সট ফাইলগুলিতে শক্ত ট্যাবগুলিকে নরম ট্যাবগুলিতে পুনরাবৃত্তভাবে রূপান্তর করতে নিম্নলিখিত স্ক্রিপ্টটি ডাউনলোড করুন এবং চালান।
ফোল্ডারটির ভিতরে থেকে স্ক্রিপ্টটি কার্যকর করুন যাতে প্লেইন পাঠ্য ফাইল রয়েছে।
#!/bin/bash
find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
echo "Converting... "$file"";
data=$(expand --initial -t 4 "$file");
rm "$file";
echo "$data" > "$file";
}; done;
গিট সংগ্রহস্থল বান্ধব পদ্ধতি
git-tab-to-space() (
d="$(mktemp -d)"
git grep --cached -Il '' | grep -E "${1:-.}" | \
xargs -I'{}' bash -c '\
f="${1}/f" \
&& expand -t 4 "$0" > "$f" && \
chmod --reference="$0" "$f" && \
mv "$f" "$0"' \
'{}' "$d" \
;
rmdir "$d"
)
বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের উপর কাজ করুন:
git-tab-to-space
কেবল সি বা সি ++ ফাইলে কাজ করুন:
git-tab-to-space '\.(c|h)(|pp)$'
আপনি সম্ভবত এটি উল্লেখ করতে চান কারণ সেই বিরক্তিকর মেকফিলগুলি যার জন্য ট্যাব প্রয়োজন।
আদেশ git grep --cached -Il ''
:
.git
যেমনটি এখানে ব্যাখ্যা করা হয়েছে: গিট সংগ্রহস্থলের সমস্ত পাঠ্য (নন-বাইনারি) ফাইল তালিকাভুক্ত করবেন কীভাবে?
chmod --reference
ফাইলের অনুমতিগুলি অপরিবর্তিত রাখে: /unix/20645/clone-ownership-and-perifications-from-another-file দুর্ভাগ্যক্রমে আমি একটি সংযুক্ত POSIX বিকল্প খুঁজে পাই না ।
যদি আপনার কোডবেজে স্ট্রিংগুলিতে ক্রিয়ামূলক কাঁচা ট্যাবগুলিকে অনুমতি দেওয়ার জন্য উন্মাদ ধারণা থাকে তবে ব্যবহার করুন:
expand -i
এবং তারপরে লাইন ট্যাবগুলির সমস্ত অ-শুরু করে এক সাথে মজা করুন, যার সাথে আপনি তালিকাভুক্ত করতে পারেন: ট্যাবগুলির জন্য গ্রেপ দেওয়া কি সম্ভব?
উবুন্টু 18.04 এ পরীক্ষিত।
কেবলমাত্র ".lua" ফাইলগুলিতে ট্যাবগুলিকে মহাকাশে রূপান্তর করা হচ্ছে [ট্যাব -> 2 স্পেস]
find . -iname "*.lua" -exec sed -i "s#\t# #g" '{}' \;
expand -t 4 input >output
)
expand -t 4
ট্যাবটি a\tb
3 স্পেসে এবং ট্যাবটিকে 2 স্পেসে প্রসারিত করবে aa\tb
যেমনটি হওয়া উচিত। expand
কোনও ট্যাবের sed
প্রসঙ্গটি বিবেচনায় নিয়ে যায়, প্রসঙ্গ নির্বিশেষে আপনার নির্দিষ্ট জায়গাগুলির পরিমাণের সাথে ট্যাবটি প্রতিস্থাপন করে না এবং প্রতিস্থাপন করবে।
ভিম-ওয়ে ব্যবহার করুন:
$ ex +'bufdo retab' -cxa **/*.*
globstar
( **
) ব্যবহার করতে , দ্বারা সক্রিয় করুন shopt -s globstar
।**/*.c
।ট্যাবস্টপটি সংশোধন করতে, যুক্ত করুন +'set ts=2'
।
তবে ডাউন- সাইডটি এটি স্ট্রিংগুলির অভ্যন্তরে ট্যাবগুলি প্রতিস্থাপন করতে পারে ।
সুতরাং কিছুটা ভাল সমাধানের জন্য (বিকল্প ব্যবহার করে) চেষ্টা করুন:
$ ex -s +'bufdo %s/^\t\+/ /ge' -cxa **/*.*
অথবা ex
সম্পাদক + expand
ইউটিলিটি ব্যবহার করে :
$ ex -s +'bufdo!%!expand -t2' -cxa **/*.*
ট্রেলিং স্পেসগুলির জন্য, দেখুন: একাধিক ফাইলের জন্য ট্র্যাকিং হোয়াইটস্পেসগুলি কীভাবে সরিয়ে ফেলবেন?
আপনি নিম্নলিখিত ফাংশনটি এতে যুক্ত করতে পারেন .bash_profile
:
# Convert tabs to spaces.
# Usage: retab *.*
# See: https://stackoverflow.com/q/11094383/55075
retab() {
ex +'set ts=2' +'bufdo retab' -cxa $*
}
:retab
কিছুতেই কাজ নাও করতে পারে , শেল গ্লোব্বিং এই ধরণের জিনিসটির জন্য একটি খারাপ সমাধান , আপনার :s
কমান্ড যে কোনও পরিমাণ ট্যাবকে 2 স্পেস দিয়ে প্রতিস্থাপন করবে (যা আপনি প্রায় কখনই চাইবেন না), কেবল কোনও :!expand
প্রক্রিয়া চালানোর জন্য প্রারম্ভিক