【发布时间】:2011-01-14 17:50:07
【问题描述】:
这是我在所有文件上递归运行 dos2unix 的方法:
find -exec dos2unix {} \;
我需要更改什么以使其跳过 .svn/ 目录下的文件?
【问题讨论】:
这是我在所有文件上递归运行 dos2unix 的方法:
find -exec dos2unix {} \;
我需要更改什么以使其跳过 .svn/ 目录下的文件?
【问题讨论】:
在 bash 中
for fic in **/*; dos2unix $fic
在 zsh 中甚至更好
for fic in **/*(.); dos2unix $fic
【讨论】:
.svn/ 目录?
for plfile in *.pl; do dos2unix $plfile; done; for plfile in **/*.pl; do dos2unix $plfile; done;
只是提供一个额外的提示:如果过滤程序接受多个参数,通过 xargs 管道而不是使用 find 的 -exec 选项将提高性能,因为这将减少 fork() 的数量的,所以:
找到
一个警告:如果任何文件名包含空格,通过 xargs 的管道将严重失败。
【讨论】:
find ... -print0 | xargs -0 ... 处理带有空格的文件名。
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
【讨论】:
-i 已弃用,请改用-I{}。另外,为什么要两个"{}"?
实际测试解决方案:
$ find . -type f \! -path \*/\.svn/\* -exec dos2unix {} \;
【讨论】:
这是一个通用脚本,您可以根据需要在其中更改最后一行。 我从我的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
【讨论】: