Как запустить команду рекурсивно во всех файлах, кроме тех, что находятся в каталогах .svn

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

find -exec dos2unix {} \;

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

Ответы

Ответ 1

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

$ find . -type f \! -path \*/\.svn/\* -exec dos2unix {} \;

Ответ 2

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

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

Ответ 3

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

найти <opts> | xargs dos2unix

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

Ответ 4

В bash

for fic in **/*; dos2unix $fic

Или даже лучше в zsh

for fic in **/*(.); dos2unix $fic

Ответ 5

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