전체 프로젝트의 후행 공백을 모두 제거하려면 어떻게해야합니까? 루트 디렉토리에서 시작하여 모든 폴더의 모든 파일에서 후행 공백을 제거합니다.
또한 모든 것을 stdout에 인쇄하는 것이 아니라 파일을 직접 수정할 수 있기를 원합니다.
전체 프로젝트의 후행 공백을 모두 제거하려면 어떻게해야합니까? 루트 디렉토리에서 시작하여 모든 폴더의 모든 파일에서 후행 공백을 제거합니다.
또한 모든 것을 stdout에 인쇄하는 것이 아니라 파일을 직접 수정할 수 있기를 원합니다.
답변:
다음은 OS X> = 10.6 Snow Leopard 솔루션입니다.
.git 및 .svn 폴더 와 그 내용을 무시합니다 . 또한 백업 파일을 남기지 않습니다.
export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
\+
대신 사용하여 더 빠르게 만들 수 있습니다. *
그렇지 않으면 모든 단일 행에서 일치합니다.
sed: RE error: illegal byte sequence
나를 위해 돌아옵니다 .
export LANG=C
하고 다시 시도
export LC_CTYPE=C
과 같이 필요 합니다. stackoverflow.com/questions/19242275/…
사용하다:
find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'
".bak"파일 생성을 원하지 않는 경우 :
find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
zsh 사용자는 찾기 호출을 생략하고 대신 다음을 사용할 수 있습니다.
perl -pi -e 's/ +$//' **/*
참고 : .git
디렉토리 파괴를 방지하려면 다음을 추가해보십시오 -not -iwholename '*.git*'
..
.git
좋습니다. 즉 , 아무리 깊게 중첩되어 있더라도 디렉토리 가있는 폴더 내부가 아닙니다 .
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
rsync -rv --exclude=.git repo/ repo2/
로컬 변경 사항 repo
도 (손상되지 않음)에 포함 되어이 작업을 통해 git 저장소를 망가 뜨리지 않고 복구했습니다 repo2
.
DOS 줄 바꿈 (CR / LF)과 함께 작동하고 바이너리 파일 을 피하는 데 꽤 좋은 작업을 수행하는 두 가지 대체 방법 :
MIME 유형이 다음으로 시작하는지 확인하는 일반 솔루션text/
:
while IFS= read -r -d '' -u 9
do
if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
then
sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
else
echo "Skipping $REPLY" >&2
fi
done 9< <(find . -type f -print0)
Git 이 바이너리로 간주하는 파일을 건너 뛰는-I
옵션을 사용하는 Mat의 Git 저장소 별 솔루션git grep
:
git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'
Bash에서 :
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
참고 : .git
저장소를 사용하는 경우 추가해보십시오 -not -iwholename '.git'
..
이것은 GNU sed 또는 xargs를 사용하지 않는 OSX 10.5 Leopard에서 저에게 효과적이었습니다.
find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"
제외해야 할 파일이 있으면 조심하십시오 (내가했습니다)!
-prune을 사용하여 특정 디렉토리 나 파일을 무시할 수 있습니다. git 저장소의 Python 파일의 경우 다음과 같이 사용할 수 있습니다.
find dir -not -path '.git' -iname '*.py'
find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'
. dir
재귀 할 최상위 레벨로 문제의 디렉토리로 바꿉니다 .
sed -i .bak
? sed -i.bak
(공백없이) 해야하지 않습니까?
이러한 종류의 작업을 위해 Ack가 만들어졌습니다.
grep처럼 작동하지만 .svn, .git, .cvs 등과 같은 위치로 내려 가지 않는 것을 알고 있습니다.
ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'
find / grep으로 농구를 뛰어 넘는 것보다 훨씬 쉽습니다.
Ack는 대부분의 패키지 관리자 ( ack 또는 ack-grep ) 를 통해 사용할 수 있습니다 .
이것은 단지 Perl 프로그램이기 때문에 다운로드하고 실행할 수있는 단일 파일 버전으로도 제공됩니다. 참조 : Ack Install
ack
멋진. 수년 동안 사용했으며 대부분의 배포판에서 거의 모든 패키지 저장소에서 사용할 수 있습니다.
ex
사용해보십시오 Ex 편집기를 (Vim의 일부) :
$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*
참고 : 재귀 (bash4 및 zsh)의 경우 경우 새로운 globbing 옵션 ( **/*.*
)을 사용합니다. 에서 활성화합니다 shopt -s globstar
.
다음 기능을 추가 할 수 있습니다. .bash_profile
.
# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
ex +'bufdo!%s/\s\+$//e' -cxa $*
}
sed
사용을 위해 sed
하려면 sed로 후행 공백을 제거하는 방법을 확인하십시오.
find
remove_trail_spaces.sh
파일에서 후행 공백을 제거하기위한 다음 스크립트 (예 :)를 찾으십시오 .
#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: /programming/149057/how-to-remove-trailing-whitespace-of-all-files-recursively
case "$OSTYPE" in
darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
find . -type f -not -iwholename '*.git*' -print0 | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
find . -type f -name \*.bak -print0 | xargs -0 rm -v
;;
*)
find . -type f -not -iwholename '*.git*' -print0 | xargs -0 perl -pi -e 's/ +$//'
esac
스캔하려는 디렉토리에서이 스크립트를 실행하십시오. 마지막에 OSX에서는 .bak
.
아니면 그냥 :
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
Spring Framework Code Style에서 권장하는 방식 입니다.
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
모두가 아니라 하나의 후행 공백 만 제거합니다.
나는 찾기를 사용하지 않고 백업 파일을 만들지 않았습니다.
sed -i '' 's/[[:space:]]*$//g' **/*.*
파일 트리의 깊이에 따라이 정도 (짧은 버전)이면 충분할 수 있습니다.
참고 이것은 예를 들어 바이너리 파일도 사용합니다.
파일을 제외하는 대신 파일 확장자에 따라 파일을 명시 적으로 화이트리스트에 나열한 위의 변형이 있습니다. 자유롭게 맛볼 수 있습니다.
find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
-name "*.rb*"
나는 pojo와 adams 버전이 섞인 이것을 실행하게되었습니다.
후행 공백과 또 다른 형태의 후행 공백 인 캐리지 리턴을 모두 정리합니다.
find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
-exec sed -i 's/[:space:]+$//' \{} \; \
-exec sed -i 's/\r\n$/\n/' \{} \;
.git 폴더가 있으면 건드리지 않습니다.
편집 : ".git"또는 ".svn"이 포함 된 파일을 가져 오지 못하도록 주석 뒤에 조금 더 안전하게 만들었습니다. 그러나 일부가 있다면 바이너리 파일 을 건드릴 것 입니다 . .py 및 .php 파일과 같은 터치 만 원할 경우 -iname "*.py" -or -iname "*.php"
after를 사용하십시오 -type f
.
업데이트 2 : 이제 줄 끝에서 모든 종류의 공백을 대체합니다 (탭도 의미 함).
정규식을 사용합니다. 4 단계 :
이렇게하면 모든 파일의 각 줄 끝에있는 모든 후행 공백이 제거됩니다. 그리고 이러한 요구에 맞지 않는 일부 파일을 제외 할 수 있습니다.
1) 다른 많은 답변이 -E
. 문서화되지 않은 BSD 호환성 옵션 이기 때문에 이유가 확실하지 않습니다 .-r
대신 사용해야합니다.
2) 기타 답변은 -i ''
. 바로 뒤에 접미사가 있기 때문에 그냥 -i
(또는 -i''
선호하는 경우) 있어야합니다 -i
.
3) Git 특정 솔루션 :
git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'
git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'
첫 번째 check-whitespace
는 후행 공백이있는 파일을 나열 하는 git 별칭 을 등록합니다 . 두 번째는 sed
그들 위에서 실행 됩니다.
일반적으로 세로 탭, 양식 피드 및 깨지지 않는 공백이 표시되지 않으므로 \t
대신 사용 [:space:]
합니다. 측정은 다를 수 있습니다.
이것은 나를 위해 작동하는 것입니다 (Mac OS X 10.8, Homebrew가 설치 한 GNU sed).
find . -path ./vendor -prune -o \
\( -name '*.java' -o -name '*.xml' -o -name '*.css' \) \
-exec gsed -i -E 's/\t/ /' \{} \; \
-exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
-exec gsed -i -E 's/\r\n/\n/' \{} \;
후행 공백을 제거하고 탭을 공백으로 바꾸고 Windows CRLF를 Unix로 바꿉니다 \n
.
흥미로운 점은 모든 정리 gsed
지침에 따라 모든 파일이 수정되기 전에이 작업을 3-4 번 실행해야한다는 것 입니다.