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

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

另外,我希望能够直接修改文件,而不是将所有内容都打印到标准输出。

这里是一个OS X> = 10.6的雪豹解决scheme。

它忽略.git和.svn文件夹及其内容。 也不会留下备份文件。

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用户,你可以省略呼叫find,而是使用:

 perl -pi -e 's/ +$//' **/* 

注:为防止破坏.git目录,请尝试添加: -not -iwholename '*.git*'

在Bash:

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

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

两种替代方法也可以与DOS换行符 (CR / LF)一起使用,并且在避免二进制文件方面做得很好:

检查MIMEtypes以text/开头的通用解决scheme

 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存储库特定的解决scheme ,它使用git grep-I选项来跳过Git认为是二进制的文件:

 git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/' 

这在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]+$//' 

比使用find / grep跳过循环要容易得多。

Ack可以通过大多数软件包pipe理器( ackack-grep )使用。

这只是一个Perl程序,所以它也可以在一个单一的文件版本,你可以下载并运行。 请参阅: 确认安装

我结束了不使用查找和不创build备份文件。

 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版本之间的混合。

它将清除尾部空白和尾部空白的另一种forms,回车:

 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" after -type f如果你只想触摸例如.py和.php文件。

更新2 :它现在replace行结束处的所有types的空间(这也意味着标签)

这效果很好..添加/删除 – 包括特定的文件types:

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

ruby:

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

防爆

尝试vim方式:

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

对于recursion(bash4&zsh),您可以使用扩展匹配( **/*.* )。

使用sed ,检查: 如何删除尾随sed的空白?


您可以将以下函数添加到.bash_profile

 # Strip trailing whitespaces. # Usage: trim *.* # See: https://stackoverflow.com/q/10711051/55075 trim() { ex +'bufdo!%s/\s\+$//e' -cxa $* } 

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推荐的方法。

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

删除尾随空格,用空格replace标签,用UnixreplaceWindows CRLF \n

有趣的是,在所有文件修好之前,我必须通过所有清理指令运行3-4次。

1)许多其他答案使用-E 。 我不知道为什么,因为这是无证的BSD兼容性选项。 应该使用-r

2)其他答案使用-i '' 。 这应该只是-i (或者-i''如果被select的话),因为-i后面有后缀。

3)Git的具体解决scheme:

 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 alias check-whitespace ,它列出了尾随空格的文件。 第二个跑在他们身上。

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