Как выполнить команду рекурсивно для всех файлов, кроме тех, которые находятся в каталогах .svn - PullRequest
17 голосов
/ 09 февраля 2010

Вот как я рекурсивно запускаю dos2unix для всех файлов:

find -exec dos2unix {} \;

Что мне нужно изменить, чтобы пропустить файлы в .svn / directoryies?

Ответы [ 5 ]

22 голосов
/ 09 февраля 2010

Фактически протестированное решение:

$ find . -type f \! -path \*/\.svn/\* -exec dos2unix {} \;
2 голосов
/ 09 февраля 2010

Вот общий сценарий, в котором вы можете изменить последнюю строку при необходимости. Я взял технику из моего findrepo сценария:

repodirs=".git .svn CVS .hg .bzr _darcs"
for dir in $repodirs; do
    repo_ign="$repo_ign${repo_ign+" -o "}-name $dir"
done

find \( -type d -a \( $repo_ign \)  \) -prune -o \
     \( -type f -print0 \) |
xargs -r0 \
dos2unix
1 голос
/ 09 февраля 2010

Просто предлагая дополнительный совет: передача результата через xargs вместо использования параметра find -exec повысит производительность при прохождении через большую структуру каталогов, если программа фильтрации принимает несколько аргументов, так как это уменьшит число fork () х, так:

найти | xargs dos2unix

Одно предостережение: прохождение через xargs ужасно не удастся, если в именах файлов есть пробелы.

0 голосов
/ 09 февраля 2010
find . -path ./.svn -prune -o -print0   | xargs -0 -i echo dos2unix "{}" "{}"

если у вас bash 4.0

shopt -s globstar
shopt -s dotglob
for file in /path/**
do
  case "$file" in
    */.svn* )continue;;
  esac
  echo dos2unix $file $file
done
0 голосов
/ 09 февраля 2010

В Баш

for fic in **/*; dos2unix $fic

или еще лучше в зш

for fic in **/*(.); dos2unix $fic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...