আমি কিভাবে ডিরেক্টরিগুলির প্রতিটি ফাইলের ট্যাবগুলিকে স্পেসে রূপান্তর করতে পারি?


251

আমি কীভাবে ডিরেক্টরিগুলির প্রতিটি ফাইলের (সম্ভবত পুনরাবৃত্তভাবে) ট্যাবগুলিকে স্পেসে রূপান্তর করতে পারি?

এছাড়াও, ট্যাব প্রতি স্পেস সংখ্যা নির্ধারণ করার কোন উপায় আছে?


আপনি ফাইল বা ফাইলের নামগুলিতে ট্যাবগুলি প্রতিস্থাপন করতে চান?
সিপিপি কোডার

3
prএটির জন্য একটি দুর্দান্ত উপযোগিতা। এই উত্তর দেখুন ।
কোডফোরস্টার

উত্তর:


69

সতর্কতা: এটি আপনার রেপো ভেঙে দেবে।

এই দুর্নীতিগ্রস্ত বাইনারি ফাইল হবে ঐ অধীনে সহ svn, .git! ব্যবহার করার আগে মন্তব্য পড়ুন!

find . -iname '*.java' -type f -exec sed -i.orig 's/\t/ /g' {} +

মূল ফাইল হিসাবে সংরক্ষণ করা হয় [filename].orig

আপনি যে ফাইল ধরণের সন্ধান করছেন তাতে ফাইলের সমাপ্তির সাথে '*। জাভা' প্রতিস্থাপন করুন। এইভাবে আপনি বাইনারি ফাইলগুলির দুর্ঘটনাকবলিত দুর্নীতি রোধ করতে পারেন।

downsides:

  • কোনও ফাইলের সর্বত্র ট্যাব প্রতিস্থাপন করবে।
  • আপনার যদি এই ডিরেক্টরিতে একটি 5 গিগাবাইট এসকিউএল ডাম্প লাগে তবে দীর্ঘ সময় লাগবে।

12
ট্যাবস এবং স্পেসগুলির মিশ্রণকারী ভিজ্যুয়াল স্পেসের জন্য, এই পদ্ধতির ভুল প্রসার দেওয়া।
পিজা

7
আমি উদাহরণস্বরূপ একটি ফাইল ম্যাচারের সাথে যুক্ত করব কেবলমাত্র। Php ফাইলগুলির জন্য ./ -iname "*। Php" -প্রকার এফ-এক্সেক সেড -i 's / \ t / / g' {} \;
ড্যানিয়েল লুকা ক্লিন ইউনিকর্ন

98
SED ব্যবহার করবেন না! যদি কোনও স্ট্রিংয়ে এমবেডড ট্যাব থাকে তবে আপনি আপনার কোডটি ম্যাঙ্গাল করে শেষ করতে পারেন। এটি হ'ল সম্প্রসারিত কমান্ডকে বোঝানো হয়েছিল। ব্যবহার expand
ডেভিড ডব্লিউ।

5
@DavidW। আমি কেবলমাত্র লাইনের শুরু থেকে ট্যাব প্রতিস্থাপন করতে এই আদেশটি আপডেট করব। find ./ -type f -exec sed -i 's/^\t/####/g' {} \;। তবে আমি প্রসারিত কমান্ড সম্পর্কে সচেতন ছিলাম না - খুব দরকারী!
মার্টিন কনেকেনি

29
ব্যবহার করবেন না! এই উত্তরটি স্রেফ আমার স্থানীয় গিট সংগ্রহস্থলকে ধ্বংস করে দিয়েছে। আপনার যদি মিশ্র ট্যাব এবং ফাঁকা স্থান রয়েছে এমন ফাইলগুলি থাকে তবে এটি # এর ক্রম সন্নিবেশ করবে। জিনের উত্তর বা তার পরিবর্তে নীচে ডোজে মন্তব্য ব্যবহার করুন।
পুতুল

344

এর সাথে সরল প্রতিস্থাপন sedঠিক আছে তবে সর্বোত্তম সম্ভাব্য সমাধান নয়। ট্যাবগুলির মধ্যে যদি "অতিরিক্ত" স্পেস থাকে তবে তারা প্রতিস্থাপনের পরেও সেখানে থাকবে, সুতরাং মার্জিনগুলি র‌্যাগ হবে। লাইনের মাঝখানে প্রসারিত ট্যাবগুলিও সঠিকভাবে কাজ করবে না। ইন bash, আমরা পরিবর্তে বলতে পারেন

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

expandবর্তমান ডিরেক্টরি গাছের প্রতিটি জাভা ফাইলের জন্য প্রয়োগ করতে। -nameআপনি যদি অন্য কোনও ফাইলের ধরণের লক্ষ্যবস্তু করে থাকেন তবে যুক্তিটি সরান / প্রতিস্থাপন করুন । মন্তব্যের মধ্যে একটির হিসাবে উল্লেখ করা হয়েছে, -nameদুর্বল, ওয়াইল্ডকার্ড অপসারণ বা ব্যবহার করার সময় খুব সতর্কতা অবলম্বন করুন । আপনি সহজেই ইচ্ছাকৃত ছাড়াই ক্লোবার সংগ্রহস্থল এবং অন্যান্য লুকানো ফাইলগুলি করতে পারেন। এই কারণেই মূল উত্তরটি এতে অন্তর্ভুক্ত করেছে:

আপনার যদি কিছু সমস্যা হয়ে যায় তবে এই জাতীয় কিছু চেষ্টা করার আগে আপনার সর্বদা গাছের একটি ব্যাকআপ কপি তৈরি করা উচিত।


2
@ জেফ্রেমার্টিনেজ দুর্দান্ত প্রশ্ন। gniourf_gniourf 11 নভেম্বর আমার আসল উত্তরটি সম্পাদনা করেছে এবং সঠিকভাবে ব্যবহারের সঠিক উপায়টি না জানার বিষয়ে বিতর্কিত মন্তব্য করেছে {}। দেখে মনে হচ্ছে $0কখন -cসে ব্যবহৃত হয় সে সম্পর্কে তিনি জানতেন না । তারপরে ডিমেও 414 আমার রূপান্তর ডিরেক্টরিতে একটি টেম্পের ব্যবহার থেকে পরিবর্তিত হয়েছে /tmp, যা /tmpকোনও ভিন্ন মাউন্ট পয়েন্টে থাকলে খুব ধীর হবে । দুর্ভাগ্যক্রমে আপনার $0প্রস্তাব পরীক্ষা করার জন্য আমার কাছে লিনাক্স বক্স নেই । তবে আমি আপনাকে সঠিক বলে মনে করি।
জিন

1
@ জিন, স্পষ্টির জন্য ধন্যবাদ, এটি স্ট্যাকওভারফ্লো ঠিক মতো শোনাচ্ছে: পি। যদিও আমি সেখানে এসেছি, আমি যুক্ত করব যে আমি *। জাভা যথাযথভাবে পালানোর জন্য '* .জাভা' এর কাছাকাছি উদ্ধৃতি ব্যবহার করতে হয়েছিল।
জেফ্রি মার্টিনেজ

2
যদি কারও খুঁজে পেতে 'অজানা প্রাথমিক বা অপারেটর' ত্রুটি থেকে থাকে তবে এখানে সম্পূর্ণ আদেশটি এটি ঠিক করবে:find . -name '*.java' ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
ডোজ

4
আমি ভেবেছিলাম যেমন ছিল এই উত্তরটি যথেষ্ট মন্তব্য ছিল, তাই এই খনি: যদি ব্যবহার ব্যবহার spongeথেকে joeyh.name/code/moreutils , আপনি লিখতে পারেনfind . -name '*.py' ! -type d -exec bash -c 'expand -t 8 "$0" | sponge "$0"' {} \;
tokland

8
বোকা এবং ব্যবহার করবেন না find . -name '*', আমি আমার স্থানীয় গিট রেপোটি ধ্বংস করেছি
গৌতম

193

কমান্ড লাইন সরঞ্জাম ব্যবহার করে দেখুন expand

expand -i -t 4 input | sponge output

কোথায়

  • -i প্রতিটি লাইনে কেবল শীর্ষস্থানীয় ট্যাবগুলি প্রসারণ করতে ব্যবহৃত হয়;
  • -t 4 এর অর্থ হ'ল প্রতিটি ট্যাব 4 টি সাদা স্পেস অক্ষরে রূপান্তরিত হবে (8 ডিফল্টরূপে)।
  • spongeএটি moreutilsপ্যাকেজ থেকে রয়েছে এবং ইনপুট ফাইল সাফ করা এড়িয়ে চলে ।

অবশেষে, আপনি হোমব্রিউ ( ) দিয়ে gexpandইনস্টল করার পরে, ওএসএক্সে ব্যবহার করতে পারেন ।coreutilsbrew install coreutils


5
এটা তোলে এর এক GNU_Core_Utilities
keV

32
আপনার প্রতিটি লাইনে কেবল শীর্ষস্থানীয় ট্যাবগুলি প্রতিস্থাপন -iকরতে expandহবে। এটি কোডের অংশ হতে পারে এমন ট্যাবগুলি প্রতিস্থাপন এড়াতে সহায়তা করে।
কোলোনেল প্রশ্ন

10
ডিরেক্টরিগুলির প্রতিটি ফাইলের পুনরাবৃত্তির জন্য কীভাবে?
আহ্নবিজক্যাড

4
যতবারই আমি এটি ব্যবহার করার চেষ্টা করি তখন এটি কিছু ফাইল (সাধারণত সমস্ত) ফাঁকা করে দেয়। : \
থারস্মমনার

5
@ থারস্মমনার: যদি ব্যাশ ক্লাববার্সের inputমতো একই ফাইলটি outputশুরু করার আগেও বিষয়বস্তুতে থাকে expand। এভাবেই >কাজ করে।
রবার্ট সিমার

34

জিনের উত্তর থেকে সর্বোত্তম মন্তব্য সংগ্রহ করা , এখন পর্যন্ত সর্বোত্তম সমাধান, মুর্টিল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ফাইল ব্যবহার করা হয় না।


2
টিআইএল: লিনাক্স ব্যবহারের 15 বছর পরে, দুর্দান্ত স্পঞ্জ কমান্ড। আপনাকে ইন্টারনেট থেকে রহস্যময় নাইট ধন্যবাদ।
sscarduzio

19

ব্যাকস্ল্যাশ-পলায়ন ব্যবহার করুন 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

2
@ Машаsed -i '' $'s/\t/ /g' $(find . -name "*.txt")
xyzale

এই উত্তরটি সবচেয়ে সহজ বলে মনে হচ্ছে।
ইয়ান কিং ইয়িন

6

আপনি সাধারণত উপলব্ধ 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

বাইনারি ফাইলগুলি এড়িয়ে যাওয়ার যুক্তি এই পোস্ট থেকে ।

বিঃদ্রঃ:

  1. গিট বা এসএনএন রেপোতে এটি করা বিপজ্জনক হতে পারে
  2. স্ট্রিং লিটারেলগুলিতে ট্যাব এম্বেড থাকা কোড ফাইলগুলি থাকলে এটি সঠিক সমাধান নয়

1
expandউভয় POSIX হয় যে দেওয়া কোনও সুবিধা ? উদাহরণস্বরূপ এটির একটি ইনলাইন পরিবর্তন বিকল্প রয়েছে? এ git নিরাপত্তা: stackoverflow.com/a/52136507/895245
সিরো Santilli郝海东冠状病六四事件法轮功

5

আমি কীভাবে ডিরেক্টরিগুলির প্রতিটি ফাইলের (সম্ভবত পুনরাবৃত্তভাবে) ট্যাবগুলিকে স্পেসে রূপান্তর করতে পারি?

এটি সাধারণত যা চান তা নয়

আপনি কি পিএনজি চিত্রগুলির জন্য এটি করতে চান? পিডিএফ ফাইল? .Git ডিরেক্টরি? আপনার Makefile(যা ট্যাব প্রয়োজন )? একটি 5 জিবি এসকিউএল ডাম্প?

আপনি, তাত্ত্বিকভাবে, findআপনি ব্যবহার করছেন বা অন্য যে কোনও কিছুতে বহিষ্কার বিকল্পগুলি পুরোপুরি পাস করতে পারেন; তবে এটি ভঙ্গুর এবং অন্যান্য বাইনারি ফাইল যুক্ত করার সাথে সাথেই এটি ভেঙে যাবে।

আপনি যা চান তা অন্তত:

  1. একটি নির্দিষ্ট আকারে ফাইলগুলি এড়িয়ে যান।
  2. কোনও নূয়াল বাইটের উপস্থিতি যাচাই করে কোনও ফাইল বাইনারি কিনা তা সনাক্ত করুন।
  3. কোনও ফাইলের শুরুতে কেবল ট্যাবগুলি প্রতিস্থাপন করুন (এটি 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)

Git মধ্যেই বাইনারি চেক সহজ: stackoverflow.com/a/52136507/895245
সিরো Santilli郝海东冠状病六四事件法轮功

5

পুনরাবৃত্তাকারী অ্যাপ্লিকেশনটির জন্য উপরে "সন্ধান করুন" উদাহরণটি আমার পছন্দ হয়েছে এটিকে পুনরাবৃত্তিযোগ্য হিসাবে মানিয়ে নিতে, কেবল বর্তমান ডিরেক্টরিতে ফাইলগুলি পরিবর্তন করা যা একটি ওয়াইল্ডকার্ডের সাথে মেলে, শেল গ্লোব সম্প্রসারণ খুব অল্প পরিমাণে ফাইলের জন্য পর্যাপ্ত হতে পারে:

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

1
শেল গ্লোব্বিং শীঘ্রই বা পরে বিরতি হবে, কারণ ফাইলের নামের মোট পরিমাণ কেবল ARG_MAXদৈর্ঘ্যের হতে পারে । এটি লিনাক্স সিস্টেমে 128 কে, তবে শেল গ্লোব্বিংয়ের উপর নির্ভর না করার জন্য আমি এই সীমাটি পর্যাপ্ত সময় সহ্য করেছি।
মার্টিন টর্নয়েজ

1
আপনার এগুলি সত্যই খাপ খাইয়ে নিতে হবে না। findবলা যেতে পারে -maxdepth 1, এবং এটি কেবলমাত্র ডাইরেক্টরির এন্ট্রিগুলি সংশোধন করার প্রক্রিয়াজাত করে, পুরো গাছটি নয়।
শ্যাডোর্যাঞ্জার

4

আমি astyleমিশ্র ট্যাব এবং স্পেসগুলি সন্ধান করার পরে আমার সমস্ত সি / সি ++ কোডটি পুনরায় ইনডেন্ট করতাম। আপনি চাইলে এটিতে একটি নির্দিষ্ট ব্রেস স্টাইলকে জোর করার বিকল্পও রয়েছে options


4

যে কেউ এর 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। আপনার ফাইলগুলিতে মোড লাইন না থাকলে।
এক্স-ইউরি

@ এক্স-ইউরি ভাল প্রশ্ন, তবে সাধারণত চালাবেন। বেশিরভাগ লোক আক্ষরিক ক্ষেত্রে প্রকৃত ট্যাব ব্যবহার করেন না।
রিকার্ডো ক্রুজ 17

4

আমার প্রস্তাবটি ব্যবহার করা হয়:

find . -name '*.lua' -exec ex '+%s/\t/  /g' -cwq {} \;

মন্তব্যসমূহ:

  1. স্থান সম্পাদনে ব্যবহার করুন। কোনও ভিসিএসে ব্যাকআপ রাখুন। * .Orig ফাইল তৈরি করার দরকার নেই। এটি যে কোনও ক্ষেত্রেই প্রত্যাশার মতো কার্যকর হয়েছে তা নিশ্চিত করার জন্য আপনার শেষ প্রতিশ্রুতির বিরুদ্ধে ফলাফলটি আলাদা করা ভাল অনুশীলন।
  2. sedএকটি স্ট্রিম সম্পাদক is exস্থান সম্পাদনে ব্যবহার করুন । এটি শীর্ষস্থানীয় উত্তরের মতো প্রতিটি প্রতিস্থাপনের জন্য অতিরিক্ত টেম্প ফাইল এবং স্পোলিং শেলগুলি এড়িয়ে চলে ।
  3. সতর্কতা: এটি সমস্ত ট্যাবগুলির সাথে মেসেজ করে, কেবলমাত্র ইনডেন্টেশনের জন্য ব্যবহৃত হয় না। এছাড়াও এটি ট্যাবগুলির প্রসঙ্গ সচেতন প্রতিস্থাপন করে না। এটি আমার ব্যবহারের ক্ষেত্রে যথেষ্ট ছিল। তবে আপনার পক্ষে গ্রহণযোগ্য নাও হতে পারে।
  4. সম্পাদনা: find|xargsপরিবর্তে পরিবর্তে ব্যবহৃত এই উত্তরটির পূর্ববর্তী সংস্করণ find -exec। @ Gniourf-gniourf দ্বারা নির্দেশিত হিসাবে এটি ফাইলের নাম সিএফ-এ স্পেস, কোট এবং নিয়ন্ত্রণ অক্ষরের সাথে সমস্যা সৃষ্টি করে। হুইলার

exপ্রতিটি ইউনিক্স সিস্টেমে নাও পাওয়া যেতে পারে। এটির সাথে বিকল্পটি vi -eআরও মেশিনে কাজ করতে পারে। এছাড়াও, আপনার রেজেক্স দুটি শূন্যস্থান সহ যে কোনও সংখ্যক শুরুর ট্যাব অক্ষরকে প্রতিস্থাপন করে। +%s/\t/ /gমাল্টি লেভেল ইনডেন্টেশন বিনষ্ট না করে দিয়ে রেজেক্সটি প্রতিস্থাপন করুন । তবে এটি ট্যাব অক্ষরগুলিকেও প্রভাবিত করে যা ইনডেন্টেশনের জন্য ব্যবহৃত হয় না।
লুকাশ শ্মেলজেইসেন

প্রাক্তন পসিক্সের অংশ [1] তাই এটি উপলব্ধ হওয়া উচিত। মাল্টি লেভেল ইনডেন্ডেশন সম্পর্কে ভাল পয়েন্ট। আমি আসলে /\t/ /আমার ফাইলগুলিতে ভেরিয়েন্টটি ব্যবহার করেছিলাম, তবে /\t\+//নন-ইনডেন্টিং ট্যাবগুলি না ভাঙ্গার জন্য বেছে নিয়েছি । মাল্টি-ইনডেন্টেশন দিয়ে মিস করেছেন! উত্তর আপডেট করা হচ্ছে। [1] man7.org/linux/man-pages/man1/ex.1p.html#SEE%C2%A0ALSO
হেইনরিচ হার্টম্যান

2
xargsএই উপায়ে ব্যবহার করা অকেজো, অদক্ষ এবং ভাঙ্গা (ফাঁকা জায়গা বা উদ্ধৃতি সম্বলিত ফাইলের নামগুলি ভাবেন)। আপনি পরিবর্তে findএর -execসুইচ ব্যবহার করবেন না কেন ?
gniourf_gniourf

আমি যুক্তি দিয়েছি যে ফাঁকা স্থান এবং উদ্ধৃতি সহ ফাইলের নামগুলি ভেঙে গেছে; ) আপনার যদি এমন সমর্থন প্রয়োজন হয় যে আমি বেছে নিই: -print0বিকল্পগুলি সন্ধান / জার্গার্স। আমি -execযেহেতু xargs পছন্দ করি : ক) উদ্বেগের বিচ্ছেদ বি) এটি আরও সহজেই জিএনইউ সমান্তরাল দিয়ে অদলবদল করা যেতে পারে।
হেইনিখ হার্টম্যান

@Gniourf_gniourf মন্তব্য যুক্ত করে আপডেট করা হয়েছে।
হেইনরিচ হার্টম্যান

4

একটি ট্যাব এর পরিবর্তে 4 টি স্পেস ব্যবহার করতে ডিরেক্টরিতে সমস্ত জাভা ফাইলকে পুনরাবৃত্তভাবে রূপান্তর করতে:

find . -type f -name *.java -exec bash -c 'expand -t 4 {} > /tmp/stuff;mv /tmp/stuff {}' \;

কিভাবে থেকে এই উত্তর ভিন্ন এই 4 বছর আগে পোস্ট করা হয়েছে কোনটি?
পিপি

2
আপনার উত্তর তাই। প্রকৃতপক্ষে, এটি জিনের উত্তরের নিকৃষ্টতম সংস্করণ: 1) জিনের উত্তর একই নামের সাথে ডিরেক্টরিগুলির যত্ন করে। 2) প্রসারিত ব্যর্থ হলে এটি সরবে না ।
পিপি

4

আপনি ব্যবহার করতে পারেন findসঙ্গে tabs-to-spacesএই জন্য প্যাকেজ।

প্রথমে ইনস্টল করুন tabs-to-spaces

npm install -g tabs-to-spaces

তারপরে, আপনার প্রকল্পের মূল ডিরেক্টরি থেকে এই কমান্ডটি চালান;

find . -name '*' -exec t2s --spaces 2 {} \;

এটি প্রতি ফাইলগুলিতে প্রতিটি tabচরিত্রকে 2 দিয়ে প্রতিস্থাপন করবে spaces


3

দেহের উল্লেখ নেই rpl? আরপিএল ব্যবহার করে আপনি যে কোনও স্ট্রিং প্রতিস্থাপন করতে পারেন। ট্যাবগুলিকে স্পেসে রূপান্তর করতে,

rpl -R -e "\t" "    "  .

খুব সহজ.


1
এটি আমার রেপোতে সমস্ত বাইনারি ফাইল দূষিত করেছে।
অ্যারন ফ্রাঙ্ক

1
একটি দুর্দান্ত কমান্ড, তবে উপরে বর্ণিত ফোল্ডার বিকল্পে পুনরাবৃত্ত এবং সমস্ত ফাইলগুলির সাথে সম্ভাব্য বিপজ্জনক। আপনি সঠিক ফোল্ডারে বসে আছেন কিনা তা নিশ্চিত করার জন্য আমি "কেবলমাত্র ক্ষেত্রে" - ড্রাই-রান বিকল্পটি যুক্ত করব।
মর্টিমারকিটিক

2

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

2

প্লেইন টেক্সট ফাইলগুলিতে শক্ত ট্যাবগুলিকে নরম ট্যাবগুলিতে পুনরাবৃত্তভাবে রূপান্তর করতে নিম্নলিখিত স্ক্রিপ্টটি ডাউনলোড করুন এবং চালান।

ফোল্ডারটির ভিতরে থেকে স্ক্রিপ্টটি কার্যকর করুন যাতে প্লেইন পাঠ্য ফাইল রয়েছে।

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

2

গিট সংগ্রহস্থল বান্ধব পদ্ধতি

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 এ পরীক্ষিত।


-1

কেবলমাত্র ".lua" ফাইলগুলিতে ট্যাবগুলিকে মহাকাশে রূপান্তর করা হচ্ছে [ট্যাব -> 2 স্পেস]

find . -iname "*.lua" -exec sed -i "s#\t#  #g" '{}' \;

স্পষ্টতই, কোনও ট্যাব প্রসারণের উপরে কোনও ট্যাব প্রসারিত করে space সুতরাং, সেড কাজের জন্য একটি সম্পূর্ণ অনুপযুক্ত সরঞ্জাম।
সোভেন

?? @ সোভেন, আমার সিড কমান্ড একই কাজ করে যা কমান্ড প্রসারিত করে ( expand -t 4 input >output)
মাকাহ

3
অবশ্যই না. expand -t 4ট্যাবটি a\tb3 স্পেসে এবং ট্যাবটিকে 2 স্পেসে প্রসারিত করবে aa\tbযেমনটি হওয়া উচিত। expandকোনও ট্যাবের sedপ্রসঙ্গটি বিবেচনায় নিয়ে যায়, প্রসঙ্গ নির্বিশেষে আপনার নির্দিষ্ট জায়গাগুলির পরিমাণের সাথে ট্যাবটি প্রতিস্থাপন করে না এবং প্রতিস্থাপন করবে।
সোভেন

-1

ভিম-ওয়ে ব্যবহার করুন:

$ 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প্রক্রিয়া চালানোর জন্য প্রারম্ভিক
হওয়াটা

... এবং আপনার সমস্ত সমাধান বাইনারি ফাইলগুলি এবং যেমন (.png ফাইল, .pdf ফাইল, ইত্যাদি)
ক্লোবার করবে

ডকুমেন্টেশনের জন্য এটি স্পষ্টতই এক ভয়ঙ্কর পরামর্শ - এটি উপলব্ধি করতে সক্ষম হতে একাধিক প্রোগ্রামের বেশিরভাগ ধরণের অস্বচ্ছ সিনট্যাক্স এবং শব্দার্থ বিষয়গুলির সাথে ঘনিষ্ঠভাবে পরিচিত হতে হবে।
জোসিপ রডিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.