How to remove trailing whitespace of all files recursively?

前端 未结 15 1947
难免孤独
难免孤独 2020-12-07 06:58

How can you remove all of the trailing whitespace of an entire project? Starting at a root directory, and removing the trailing whitespace from all files in all folders.

相关标签:
15条回答
  • 2020-12-07 07:41

    Instead of excluding files, here is a variation of the above the explicitly white lists the files, based on file extension, that you want to strip, feel free to season to taste:

    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:]]*$//"
    
    0 讨论(0)
  • 2020-12-07 07:47

    ex

    Try using Ex editor (part of Vim):

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

    Note: For recursion (bash4 & zsh), we use a new globbing option (**/*.*). Enable by shopt -s globstar.

    You may add the following function into your .bash_profile:

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

    sed

    For using sed, check: How to remove trailing whitespaces with sed?

    find

    Find the following script (e.g. remove_trail_spaces.sh) for removing trailing whitespaces from the files:

    #!/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
    

    Run this script from the directory which you want to scan. On OSX at the end, it will remove all the files ending with .bak.

    Or just:

    find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
    

    which is recommended way by Spring Framework Code Style.

    0 讨论(0)
  • 2020-12-07 07:49

    In Bash:

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

    Note: If you're using .git repository, try adding: -not -iwholename '.git'.

    0 讨论(0)
  • 2020-12-07 07:52

    This works well.. add/remove --include for specific file types :

    egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'
    
    0 讨论(0)
  • 2020-12-07 07:53

    I ended up running this, which is a mix between pojo and adams version.

    It will clean both trailing whitespace, and also another form of trailing whitespace, the carriage return:

    find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
      -exec sed -i 's/[:space:]+$//' \{} \;  \
      -exec sed -i 's/\r\n$/\n/' \{} \;
    

    It won't touch the .git folder if there is one.

    Edit: Made it a bit safer after the comment, not allowing to take files with ".git" or ".svn" in it. But beware, it will touch binary files if you've got some. Use -iname "*.py" -or -iname "*.php" after -type f if you only want it to touch e.g. .py and .php-files.

    Update 2: It now replaces all kinds of spaces at end of line (which means tabs as well)

    0 讨论(0)
  • 2020-12-07 07:54

    I use regular expressions. 4 steps:

    1. Open the root folder in your editor (I use Visual Studio Code).
    2. Tap the Search icon on the left, and enable the regular expression mode.
    3. Enter " +\n" in the Search bar and "\n" in the Replace bar.
    4. Click "Replace All".

    This removes all trailing spaces at the end of each line in all files. And you can exclude some files that don't fit with this need.

    0 讨论(0)
提交回复
热议问题