如何删除整个项目的所有尾随空白?从根目录开始,并从所有文件夹中的所有文件中删除尾随空格。
另外,我希望能够直接修改文件,而不仅仅是将所有内容打印到stdout。
如何删除整个项目的所有尾随空白?从根目录开始,并从所有文件夹中的所有文件中删除尾随空格。
另外,我希望能够直接修改文件,而不仅仅是将所有内容打印到stdout。
Answers:
这是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
也进行了(未损坏的)更改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)
Mat专门针对Git仓库的解决方案,它使用-I
选项git grep
来跳过Git认为是二进制的文件:
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'
find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'
。替换为dir
有问题的目录作为要从中进行递归的顶级目录。
sed -i .bak
?是不是sed -i.bak
(没有空间)?
ex
尝试使用Ex编辑器(Vim的一部分):
$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*
注意:对于递归(bash4和zsh),我们使用新的globlob选项(**/*.*
)。启用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"
,-type f
则使用after 。
更新2:现在替换行尾的所有空格(也意味着制表符)
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,由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次。