当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何递归删除所有文件的尾部空格?》经验,为你挑选了10个好方法。

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

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



1> deepwell..:

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


在Mountain Lion中,这为我返回`sed:RE错误:非法字节序列`.
对于那些遇到"非法字节序列"问题的人:输入`export LANG = C`然后重试
您可以通过在替换字符串中使用`\ +'而不是`*`来加快速度 - 否则它会匹配每一行.
您可以使用[[:blank:]]删除选项卡和空格.
在OS X 10.9中,我还需要`export LC_CTYPE = C`,如下所示:http://stackoverflow.com/questions/19242275/sed-re-error-illegal-byte-sequence-on-mac-os-x
如何排除二进制文件,如.jpg,.jar,.png等,而不必专门列出每种文件类型?
也许像这样的东西稍好一点(但可以优化):`find.-not \(-name .svn -prune -o -name .git -prune \)-type f -print0 | xargs -0 file -In | grep -v binary | cut -d":" - f1 | xargs -0 sed -i'' - E"s/[[:space:]]*$ //"`(使用`file`和`grep`来过滤掉二进制文件)
这似乎也在EOF附加了一个空的新行.我只希望它修剪尾随空间.这可能吗?
不使用xargs(在GNU Linux上测试):`find。-not \(-name .svn -prune -o -name .git -prune \)-type f -exec sed -i“ s / [[:: space:]] * $ // g”“ {}” \; `

2> Sec..:

使用:

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 repo中尝试这个,因为它可能会破坏git的内部存储.
@mgold太晚了,grrr; /

3> l0b0..:

两种替代方法也适用于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/'


所以我真的很喜欢这个git解决方案.它应该真的在顶部.我不想保存回车.但我更喜欢这个我在2010年合并的那个.

4> Adam Rosenfi..:

在Bash:

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

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


要删除所有空格而不仅仅是空格,您应该在sed正则表达式中用[:space:]替换空格字符.

5> pojo..:

这在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'



6> jbbuckley..:

Ack是为这种任务而做的.

它就像grep一样工作,但知道不要下降到.svn,.git,.cvs等地方.

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

比使用find/grep跳过篮球要容易得多.

Ack可通过大多数包管理器获得(作为ackack-grep).

它只是一个Perl程序,因此它也可以在单个文件版本中使用,您只需下载并运行即可.请参阅:Ack安装



7> kenorb..:

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推荐的方式.



8> Jesper Rønn-..:

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

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

根据文件树的深度,这个(更短的版本)可能足以满足您的需求.

注意,这也需要二进制文件.



9> ChicagoBob..:

而不是排除文件,这里是上面的变体显式白色列出文件,基于文件扩展名,你想要剥离,随意季节尝试:

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



10> odinho - Vel..:

我最终运行了这个,这是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:它现在替换行尾的所有类型的空格(这也意味着标签)


我不知道发生了什么,但这完全满足了我的git repo并且弄乱了我的图像.人,比我更加小心!
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有