如何在除.svn目录下的文件之外的所有文件上递归运行命令

时间:2010-02-09 09:39:55

标签: bash unix shell find

以下是我在所有文件上递归运行dos2unix的方法:

find -exec dos2unix {} \;

我需要更改什么才能跳过.svn /目录下的文件?

5 个答案:

答案 0 :(得分:22)

实际测试的解决方案:

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

答案 1 :(得分:2)

这是一个通用脚本,您可以根据需要更改最后一行。 我从我的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 :(得分:1)

只是提供一个额外的提示:如果过滤程序接受多个参数,则通过xargs而不是使用find的-exec选项来管理结果将提高执行大型目录结构时的性能,因为这将减少fork()的数量是的,所以:

find< opts> | xargs dos2unix

有一点需要注意:如果任何文件名包含空格,那么通过xargs管道将会非常失败。

答案 3 :(得分:-1)

在bash中

for fic in **/*; dos2unix $fic

甚至在zsh中更好

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

答案 4 :(得分:-1)

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