如何递归删除所有文件的尾部空格?

时间:2008-09-29 15:01:42

标签: bash whitespace

如何删除整个项目的所有尾随空格?从根目录开始,从所有文件夹中的所有文件中删除尾部空格。

另外,我希望能够直接修改文件,而不只是将所有内容打印到stdout。

15 个答案:

答案 0 :(得分:81)

这是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:]]*$//"

答案 1 :(得分:29)

使用:

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

答案 2 :(得分:25)

两种替代方法也适用于 DOS换行符(CR / LF)并且在避免二进制文件方面做得非常好:

Generic solution检查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)
Mat的

Git repository-specific solution使用-I的{​​{1}}选项跳过Git认为是二进制的文件:

git grep

答案 3 :(得分:22)

在Bash中:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

注意:如果您使用的是.git存储库,请尝试添加:-not -iwholename '.git'

答案 4 :(得分:14)

这在OSX 10.5 Leopard中适用于我,它不使用GNU sed或xargs。

find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"

如果您有需要排除的文件(我这样做),请小心这个!

您可以使用-prune忽略某些目录或文件。对于git存储库中的Python文件,您可以使用以下内容:

find dir -not -path '.git' -iname '*.py'

答案 5 :(得分:9)

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

答案 6 :(得分:7)

ex

尝试使用Ex editor(Vim的一部分):

$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*

注意:对于递归(bash4&amp; zsh),我们使用a new globbing option**/*.*)。由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,请检查:How to remove trailing whitespaces with sed?

find

找到以下脚本(例如remove_trail_spaces.sh)以从文件中删除尾随空格:

#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: https://stackoverflow.com/questions/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推荐的方式。

答案 7 :(得分:6)

我最终没有使用find而不是创建备份文件。

sed -i '' 's/[[:space:]]*$//g' **/*.*

根据文件树的深度,此(较短版本)可能足以满足您的需求。

注意这也需要二进制文件,例如。

答案 8 :(得分:6)

除了排除文件之外,以下是上述明确白色的变体,根据文件扩展名列出了您想要剥离的文件,随意品尝季节:

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:]]*$//"

答案 9 :(得分:5)

我最终运行了这个,这是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”的文件。但要注意,如果你有一些,触摸二进制文件。 -iname "*.py" -or -iname "*.php"之后使用-type f如果您只想触及,请{{1}} .py和.php文件。

更新2 :它现在替换了行尾的所有类型的空格(也就是标签)

答案 10 :(得分:4)

这很好..添加/删除 - 包含特定文件类型:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'

答案 11 :(得分:4)

红宝石:

irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }

答案 12 :(得分:2)

1)许多其他答案都使用-E。我不确定为什么,因为那是undocumented BSD compatibility选项。应该使用-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]+$//'

第一个注册一个git别名check-whitespace,它列出了带有尾随空格的文件。 第二个对它们运行sed

我只使用\t而不是[:space:],因为我通常不会看到垂直制表符,换页符和不可分隔空格。您的测量可能会有所不同。

答案 13 :(得分:2)

我使用正则表达式。 4个步骤:

  1. 在编辑器中打开根文件夹(我使用Visual Studio Code)。
  2. 点击左侧的“搜索”图标,然后启用正则表达式模式。
  3. 在搜索栏中输入“ + \ n”,在替换栏中输入“ \ n”。
  4. 点击“全部替换”。

这将删除所有文件中每一行末尾的所有尾随空格。而且,您可以排除一些不符合此需求的文件。

答案 14 :(得分:1)

这对我有用(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/' \{} \;

删除尾随空格,用空格替换制表符,用Unix \n替换Windows CRLF。

有趣的是,我必须通过所有清洁gsed说明在所有文件修复之前运行3-4次。