디렉토리의 모든 파일에서 탭을 공백으로 변환하려면 어떻게 해야 합니까?
탭을 디렉토리의 모든 파일에 있는 공백으로 변환하려면 어떻게 해야 합니까(재귀적으로 변환될 수 있습니다.
또한 탭당 공간 수를 설정하는 방법이 있습니까?
「 」로 할 수 .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 덤프가 있는 경우 시간이 오래 걸립니다.
진의 답변으로부터 최고의 코멘트를 수집하는 것은, 지금까지의 최고의 해결책으로서,sponge
moreutils로부터.
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
바이너리 파일을 건너뛰는 논리는 이 게시물에서 나온 것입니다.
주의:
- git 또는 svn repo에서는 위험할 수 있습니다.
- 문자열 리터럴에 기본 탭이 포함된 코드 파일이 있는 경우 이는 올바른 솔루션이 아닙니다.
권장사항은 다음과 같습니다.
find . -name '*.lua' -exec ex '+%s/\t/ /g' -cwq {} \;
코멘트:
- 내부 편집을 사용합니다.VCS에 백업을 보관합니다.*.orig 파일을 생성할 필요가 없습니다.결과를 지난번 약속과 비교하여 어떤 경우에도 예상대로 동작하도록 하는 것이 좋습니다.
sed
을 사용하다ex
제자리 편집용입니다.이렇게 하면 상위 답변에서와 같이 교체될 때마다 추가 임시 파일과 산란 셸이 생성되지 않습니다.- 경고: 이것은 들여쓰기에 사용되는 탭뿐만 아니라 모든 탭과 혼동됩니다.또한 탭을 컨텍스트 인식으로 치환하지 않습니다.이 정도면 제 활용 사례에 충분했습니다.하지만 당신은 받아들일 수 없을 수도 있어요.
- 이은 다음과 같이 되었습니다.
find|xargs
find -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
사용 중인 다른 파일도 사용할 수 있지만 이는 취약하며 다른 바이너리 파일을 추가하는 즉시 손상됩니다.
당신이 원하는 것은 적어도 다음과 같습니다.
- 특정 크기 이상의 파일을 건너뜁니다.
- NULL 바이트가 있는지 확인하여 파일이 바이너리인지 여부를 탐지합니다.
- 파일 시작 부분에만 탭 바꾸기(
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
'programing' 카테고리의 다른 글
iPhone TableView셀의 셀 오른쪽에 작은 화살표 추가 (0) | 2023.04.17 |
---|---|
프라이머리 키와 아이덴티티의 차이점은 무엇입니까? (0) | 2023.04.17 |
아이폰 앱 아이콘 - 정확한 반지름? (0) | 2023.04.17 |
AUTOINCREMENT로 인해 마스터 복제가 "키 'PRIMAY'에 대한 중복 항목"으로 중단되었습니다. (0) | 2023.04.17 |
UTF-8 바이트[]를 문자열로 변환하는 방법 (0) | 2023.04.17 |