如何在所有文件上递归运行一个命令,但排除.svn目录下的文件?

17

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

find -exec dos2unix {} \;

我需要改变什么以使其跳过 .svn/ 目录下的文件?

5个回答

22

实际测试的解决方案:

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

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

1
仅提供一个额外的提示:如果筛选程序可以接受多个参数,则通过 xargs 管道传递结果而不是使用 find 的 -exec 选项,将增加处理大型目录结构时的性能,因为这样可以减少 fork() 的数量,所以:

find <opts> | xargs dos2unix

一个警告:如果任何文件名包含空格,则通过 xargs 进行管道传输会失败。


2
find ... -print0 | xargs -0 ... 处理带有空格的文件名。 - Dennis Williamson

-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

将路径中的“./.svn”更改为“*/.svn”应该可以解决这个问题。 - Juris
-i已被弃用,请使用-I{}。另外,为什么要两个“{}”? - Dennis Williamson

-1

在Bash中

for fic in **/*; dos2unix $fic

甚至在zsh中更好

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

1
这个代码是如何跳过.svn/目录的? - Nathan Fellman
如果 dotglob 被关闭,它将跳过隐藏文件。但其他隐藏文件也将被跳过,我认为这不是 OP 想要的。 - ghostdog74
抱歉!for root in {,.}(N); do [[ $root = .svn ]] && continue ; for fic in $root/**/*(.); do dos2unix $fic ; done ;虽然这段代码可以运行,但现在的查找版本更好。 - yogsototh
+1。谢谢。这对我很有效。我不必担心svn文件。 for plfile in *.pl; do dos2unix $plfile; done; for plfile in **/*.pl; do dos2unix $plfile; done; - RuntimeException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接