你怎么能删除所有整个项目的尾随空白的? 开始在根目录下,并从所有文件夹中的所有文件删除尾随空白。
另外,我希望能够直接修改该文件,而不是只打印所有到标准输出。
你怎么能删除所有整个项目的尾随空白的? 开始在根目录下,并从所有文件夹中的所有文件删除尾随空白。
另外,我希望能够直接修改该文件,而不是只打印所有到标准输出。
下面是一个OS X> = 10.6雪豹溶液。
它忽略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
的选项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'
确认是为这样的任务做。
它的工作原理就像grep的,但他知道不要陷入像.svn文件,git的,将该.cvs等场所
ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'
大部分不是通过查找/ grep的篮球跳跃更容易。
确认是通过最包管理器(作为ACK或ACK-grep)来提供。
这只是一个Perl程序,所以它也可以在你可以下载并运行一个单一的文件版本。 请参阅: 确认安装
ex
尝试使用ex编辑器 (VIM的一部分):
$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*
注意:对于递归(bash4&zsh中),我们使用了新的选择通配符 ( **/*.*
)。 通过启用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: 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框架的代码样式 。
我结束了不使用发现,而不要创建备份文件。
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和亚当斯的版本之间的混合。
它将清除这两个结尾的空白,同时也尾随空白的另一种形式,回车:
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:现在在行尾取代各类场所(如这意味着标签井)
这种运作良好..添加/删除--include为特定的文件类型:
egrep -rl ' $' --include *.c * | xargs sed -i 's/\s\+$//g'
红宝石:
irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }
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]+$//'
第一个寄存器一个git别名check-whitespace
其列出与尾部空格的文件。 第二个运行sed
他们。
我只用\t
,而不是[:space:]
我通常不会看到竖直突出,形成饲料和非易碎空间。 您的测量可能会有所不同。
这对我来说是什么在起作用(Mac OS X的10.8,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
。
有趣的是,我要运行这个3-4倍之前的所有的文件被固定,所有的清洁gsed
说明。