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

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

find -exec dos2unix {} \;

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

17
задан skaffman 9 February 2010 в 09:59
поделиться

5 ответов

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

$ find . -type f \! -path \*/\.svn/\* -exec dos2unix {} \;
22
ответ дан 30 November 2019 в 13:27
поделиться

Вот общий сценарий, в котором вы можете изменить последнюю строку по мере необходимости. Я взял технику из моего 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
2
ответ дан 30 November 2019 в 13:27
поделиться

В баш

for fic in **/*; dos2unix $fic

Или еще лучше в zsh

for fic in **/*(.); dos2unix $fic
-1
ответ дан 30 November 2019 в 13:27
поделиться

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

find | xargs dos2unix

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

1
ответ дан 30 November 2019 в 13:27
поделиться
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
-1
ответ дан 30 November 2019 в 13:27
поделиться