programing

디렉토리의 모든 파일에서 탭을 공백으로 변환하려면 어떻게 해야 합니까?

bestprogram 2023. 4. 17. 22:33

디렉토리의 모든 파일에서 탭을 공백으로 변환하려면 어떻게 해야 합니까?

탭을 디렉토리의 모든 파일에 있는 공백으로 변환하려면 어떻게 해야 합니까(재귀적으로 변환될 수 있습니다.

또한 탭당 공간 수를 설정하는 방법이 있습니까?

「 」로 할 수 .sed괜찮지만 최선의 해결책은 아닙니다.탭 사이에 "여분" 공백이 있는 경우 치환 후에도 여백이 남아 있기 때문에 여백이 거칠어집니다.행의 중간에 전개된 탭도 올바르게 동작하지 않습니다. »bash , 라고 말할 수 .

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

expand자바어「」/「」를합니다.-name다른 파일 형식을 대상으로 하는 경우 인수를 사용합니다. 중 했듯이 삭제 시 해야 합니다.-name약한 와일드카드를 사용할 수도 있습니다.저장소 및 기타 숨겨진 파일을 의도하지 않고 쉽게 클로버할 수 있습니다.이것이 원래 답변에 다음과 같은 내용이 포함된 이유입니다.

문제가 발생할 경우를 대비해 이와 같은 작업을 시도하기 전에 항상 트리의 백업 복사본을 만들어야 합니다.

명령줄 도구를 사용해 보십시오.

expand -i -t 4 input | sponge output

어디에

  • -i는 각할 때 합니다.
  • -t 4각 탭이 4개의 공백 문자(기본값 8개)로 변환됨을 의미합니다.
  • sponge 는 패키지에서 가져온 것으로, 입력 파일이 클리어 되는 을 방지합니다.MacOS의 경우 패키지moreutils는 Homebrew ( )에서 입수할 수 있습니다.brew install moreutils또는 MacPorts(sudo port install moreutils를 참조해 주세요.

'마지막으로'를 할 수 .gexpand MacOS 후 " " "coreutils홈브루 포함 (brew install coreutils또는 MacPorts(sudo port install coreutils를 참조해 주세요.

경고:이러면 네 평판이 깨질 거야.

그러면 다음 파일을 포함한 이진 파일이 손상됩니다.svn,.git을 읽어주세요 용사전 에멘!

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

은 원음음음음음음음음음음음음음음음음 the the 로 저장됩니다.[filename].orig.

'.java'를 찾고 있는 파일 형식의 파일 끝부분으로 바꿉니다.이렇게 하면 바이너리 파일의 우발적인 손상을 방지할 수 있습니다.

단점:

  • 파일의 모든 위치에 있는 탭을 바꿉니다.
  • 이 디렉토리에 5GB SQL 덤프가 있는 경우 시간이 오래 걸립니다.

진의 답변으로부터 최고의 코멘트를 수집하는 것은, 지금까지의 최고의 해결책으로서,spongemoreutils로부터.

sudo apt-get install moreutils
# The complete one-liner:
find ./ -iname '*.java' -type f -exec bash -c 'expand -t 4 "$0" | sponge "$0"' {} \;

설명:

  • ./는 current 합니다.
  • -iname하지 않는입니다(양쪽 대소문자를 구분하지 않습니다).*.java ★★★★★★★★★★★★★★★★★」*.JAVA
  • type -f일반 파일만 검색(디렉토리, 이진 파일 또는 심볼링크 없음)
  • -exec bash -c합니다.{}
  • expand -t 4 Tabs 4 (모든 탭을 4 스페이스로 )
  • sponge 입력을 expand파일(같은 파일)*에 씁니다.

메모: * 간단한 파일 리다이렉트 (> "$0" 경우 파일을 너무 빨리 덮어쓸 수 있기 때문에 여기서 작동하지 않습니다.

장점:모든 원본 파일 권한은 유지되며 중간 권한은 없습니다.tmp파일이 사용됩니다.

를 합니다.sed.

Linux의 경우:

  • 모든 *.txt 파일에서 모든 탭을 1개의 하이픈으로 바꿉니다.

    sed -i $'s/\t/-/g' *.txt
    
  • 모든 *.txt 파일에서 모든 탭을 공백 1개로 바꿉니다.

    sed -i $'s/\t/ /g' *.txt
    
  • 모든 *.txt 파일에서 모든 탭을 공백 4개로 바꿉니다.

    sed -i $'s/\t/    /g' *.txt
    

Mac의 경우:

  • 모든 *.txt 파일에서 모든 탭을 공백 4개로 바꿉니다.

    sed -i '' $'s/\t/    /g' *.txt
    

으로 사용할 수 있는 것을 할 수 .pr명령어(여기서 man 페이지).예를 들어 탭을 4개의 공간으로 변환하려면 다음과 같이 하십시오.

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. git 또는 svn repo에서는 위험할 수 있습니다.
  2. 문자열 리터럴에 기본 탭이 포함된 코드 파일이 있는 경우 이는 올바른 솔루션이 아닙니다.

권장사항은 다음과 같습니다.

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

코멘트:

  1. 내부 편집을 사용합니다.VCS에 백업을 보관합니다.*.orig 파일을 생성할 필요가 없습니다.결과를 지난번 약속과 비교하여 어떤 경우에도 예상대로 동작하도록 하는 것이 좋습니다.
  2. sed을 사용하다ex제자리 편집용입니다.이렇게 하면 상위 답변에서와 같이 교체될 때마다 추가 임시 파일과 산란 셸이 생성되지 않습니다.
  3. 경고: 이것은 들여쓰기에 사용되는 탭뿐만 아니라 모든 탭과 혼동됩니다.또한 탭을 컨텍스트 인식으로 치환하지 않습니다.이 정도면 제 활용 사례에 충분했습니다.하지만 당신은 받아들일 수 없을 수도 있어요.
  4. 이은 다음과 같이 되었습니다.find|xargsfind -exec@gniourf-gniourf가 지적한 바와 같이 파일 이름 cf의 공백, 따옴표 및 제어 문자에 문제가 발생합니다.휠러

하시면 됩니다.find이것과 함께.

" " " 를 설치합니다.tabs-to-spaces

npm install -g tabs-to-spaces

그런 다음 프로젝트의 루트 디렉토리에서 이 명령을 실행합니다.

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

하면 모든 것이 됩니다.tab 2 with2 spaces모든 파일에 있습니다.

탭을 디렉토리의 모든 파일에 있는 공백으로 변환하려면 어떻게 해야 합니까(재귀적으로 변환될 수 있습니다.

이것은 보통 당신이 원하는 것이 아니다.

png 이이? ?????? pdf pdf pdf pdf pdf pdf pdf pdf? 파일? . 디렉토리get 렉렉??의 ★★★★★★★★★★★★★★★★★.Makefile(탭이 필요한 경우)5GB SQL 덤프?

, 신, 신, 신, 신, 당, 당, 당, 당, you, you, you, you, you, you, you, you, you, you, you, you, you, you, you에 넘길 수 있습니다.find사용 중인 다른 파일도 사용할 수 있지만 이는 취약하며 다른 바이너리 파일을 추가하는 즉시 손상됩니다.

당신이 원하는 것은 적어도 다음과 같습니다.

  1. 특정 크기 이상의 파일을 건너뜁니다.
  2. NULL 바이트가 있는지 확인하여 파일이 바이너리인지 여부를 탐지합니다.
  3. 파일 시작 부분에만 탭 바꾸기(expand동작은 「」입니다.sed하지 않습니다).

제가 알기로는 이것을 할 수 있는 "표준" Unix 유틸리티는 없습니다.또한 셸 원라이너로 하는 것도 쉽지 않기 때문에 스크립트가 필요합니다.

얼마 전에 sanitize_files라는 이름의 작은 스크립트를 작성했습니다.또한 교체와 같은 일반적인 몇 가지 문제를 해결합니다.\r\n\n , 「」를 합니다.\n 등등.

아래의 추가 기능과 명령줄 인수를 사용하지 않고 단순화된 스크립트를 찾을 수 있지만, 이 게시물보다 버그 수정 및 기타 업데이트를 받을 가능성이 높기 때문에 위의 스크립트를 사용할 것을 권장합니다.

또, 여기의 몇개의 다른 회답에 대해서, 셸 글로빙을 사용하는 은, 견고한 방법이 아닙니다.조만간, 필요한 것보다 많은 파일을 얻을 수 있기 때문입니다.ARG_MAX(현대 Linux 시스템에서는 128k로 많은 것 같지만 조만간 충분하지 않습니다.)


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

위의 재귀적용에 대한 "find" 예가 마음에 듭니다.와일드카드와 일치하는 현재 디렉토리의 파일만 변경하도록 적응시키려면 셸 글로벌 확장을 통해 적은 양의 파일에 충분할 수 있습니다.

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

또는 깊이 매개 변수 등의 조합을 사용하여 find(1)를 실행합니다.

find mod/ -name '*.php' -mindepth 1 -maxdepth 2 | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh

탭과 공백이 혼재된 후 모든 C/C++ 코드를 다시 입력하곤 했습니다.또한 원하는 경우 특정 브레이스 스타일을 강제 적용할 수 있는 옵션도 있습니다.

vim경우 : 우 for :

find -type f \( -name '*.css' -o -name '*.html' -o -name '*.js' -o -name '*.php' \) -execdir vim -c retab -c wq {} \;

말한 와 같이, 그것은 당신의 Cafetsmoker에 .vim설정을 지정합니다.파일에 모델라인도 추가해 주세요.또한 행의 선두에 있는 탭뿐만 아니라 탭도 교체됩니다.탭이 수 있습니다.예를 들어 탭이 포함된 리터럴이 있을 수 있습니다.

디렉토리 내의 모든 Java 파일을 탭 대신 4개의 공간을 사용하도록 재귀적으로 변환하려면 다음 절차를 수행합니다.

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

Git 저장소 친화적 방법

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

C 또는 C++ 파일에 대해서만 작업:

git-tab-to-space '\.(c|h)(|pp)$'

탭이 필요한 성가신 Make files 때문에 이 기능이 특히 필요할 것입니다.

" " "git grep --cached -Il '':

  • 는 추적 에 내부에는 ..git
  • 디렉터리, 이진 파일(파손될 수 있음) 및 심볼 링크를 제외합니다(일반 파일로 변환됨).

에서 설명한 바와 같이 git 저장소에 있는 모든 텍스트(비바이너리) 파일을 나열하는 방법은?

chmod --reference파일 권한을 변경하지 않습니다.https://unix.stackexchange.com/questions/20645/clone-ownership-and-permissions-from-another-file 유감스럽게도 간결한 POSIX 대체 파일을 찾을 없습니다.

코드베이스에서 문자열로 기능하는 raw 탭을 허용하는 엉뚱한 아이디어가 있는 경우 다음을 사용합니다.

expand -i

다음에 리스트 할 수 있는 행의 선두가 아닌 탭을 하나씩 살펴보도록 하겠습니다.탭용 grep이 가능한가요?

Ubuntu 18.04로 테스트.

★★★★★★★★★★★★★★★★★rpl을 사용하면 의 stringrpl을 할 수 하려면 , 「」를 참조해 주세요.

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

매우 단순합니다.

다음 스크립트를 다운로드하여 실행하여 하드탭을 플레인텍스트 파일의 소프트탭으로 재귀적으로 변환합니다.

일반 텍스트 파일이 들어 있는 폴더 내부에서 스크립트를 실행합니다.

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

「 」의 expand다른 답변에서 제시된 바와 같이 이 작업만으로는 가장 논리적인 접근법인 것 같습니다.

단, Bash 및 Awk와 함께 다른 변경을 하고 싶은 경우도 있습니다.

Bash 4.0 이후를 사용하는 경우 shopt은 globstar를 으로 검색할 수 .**.

GNU Awk 버전 4.1 이후에서는 "inplace"와 같은 파일 변경이 가능합니다.

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

".lua" 파일 내에서만 탭을 공백으로 변환 [탭 -> 2스페이스]

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

vim-way를 사용합니다.

$ 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 $*
}

언급URL : https://stackoverflow.com/questions/11094383/how-can-i-convert-tabs-to-spaces-in-every-file-of-a-directory