如何删除整个项目的所有尾随空格?从根目录开始,从所有文件夹中的所有文件中删除尾随空格.
此外,我希望能够直接修改文件,而不只是将所有内容打印到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)
Mat的 Git特定于存储库的解决方案,它使用跳过Git认为是二进制的文件的-I
选项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'
.
这在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'
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安装
ex
尝试使用Ex编辑器(Vim的一部分):
$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*
注意:对于递归(bash4和zsh),我们使用一个新的globbing选项(**/*.*
).启用shopt -s globstar
.
您可以将以下功能添加到您的.bash_profile
:
# Strip trailing whitespaces. # Usage: trim *.* # See: /sf/ask/17360801/ 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: /sf/ask/17360801/ 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而不是创建备份文件.
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:]]*$//"
我最终运行了这个,这是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
如果你只希望它触及如的.py和.PHP-文件.
更新2:它现在替换行尾的所有类型的空格(这也意味着标签)