Як ви можете видалити всю пробільну частину цілого проекту? Починаючи з кореневого каталогу та видаляючи пробіли пробілу з усіх файлів у всіх папках.
Також я хочу мати можливість змінювати файл безпосередньо, а не просто друкувати все для stdout.
Як ви можете видалити всю пробільну частину цілого проекту? Починаючи з кореневого каталогу та видаляючи пробіли пробілу з усіх файлів у всіх папках.
Також я хочу мати можливість змінювати файл безпосередньо, а не просто друкувати все для stdout.
Відповіді:
Ось ОС 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)
Рішення для репозиторію Git від Mat, яке використовує-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, щоб ігнорувати певні каталоги чи файли. Для файлів Python у сховищі git ви можете використовувати щось на зразок:
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
(без місця)?
Ак був зроблений для такого роду завдань.
Він працює як греп, але знає, що не спускатися на такі місця, як .svn, .git, .cvs тощо.
ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'
Набагато простіше, ніж стрибати через обручі з find / grep.
Ack доступний через більшість менеджерів пакетів (як ack або ack-grep ).
Це просто програма Perl, тому вона також доступна в однофайловій версії, яку ви можете просто завантажити та запустити. Див.: Встановити Ack
ack
чудово. Використовували його протягом декількох років і доступні майже в усіх пакеті репостів для більшості дистрибутивів.
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: /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" в ньому. Але будьте обережні, це буде стосуватися довічних файлів , якщо у вас є деякі з них . Використовуйте -iname "*.py" -or -iname "*.php"
після, -type f
якщо ви хочете, щоб він торкнувся, наприклад, .py та .php-файлів.
Оновлення 2 : Тепер він замінює всі види пробілів у кінці рядка (що означає також вкладки)
Це добре працює .. додати / видалити --включити для конкретних типів файлів:
egrep -rl ' $' --include *.c * | xargs sed -i 's/\s\+$//g'
Я використовую регулярні вирази. 4 кроки:
Це видаляє всі пробіли в кінці кожного рядка у всіх файлах. І ви можете виключити деякі файли, які не відповідають цій потребі.
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 встановлений Homebrew):
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/' \{} \;
Вилучені пробіли, заміняючи вкладки пробілами, замінює CRLF Windows на Unix \n
.
Що цікаво, це те, що я маю запустити це 3-4 рази, перш ніж усі файли виправляються, згідно з усіма gsed
інструкціями щодо очищення .