[bash] 모든 파일의 후행 공백을 재귀 적으로 제거하는 방법은 무엇입니까?

전체 프로젝트의 후행 공백을 모두 제거하려면 어떻게해야합니까? 루트 디렉토리에서 시작하여 모든 폴더의 모든 파일에서 후행 공백을 제거합니다.

또한 모든 것을 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:]]*$//"


답변

사용하다:

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*'..


답변

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'


답변

이러한 종류의 작업을 위해 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


답변

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에서 권장하는 방식 입니다.