Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在除.svn目录下的文件以外的所有文件上递归运行命令_Bash_Unix_Shell_Find - Fatal编程技术网

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

Bash 如何在除.svn目录下的文件以外的所有文件上递归运行命令,bash,unix,shell,find,Bash,Unix,Shell,Find,以下是我如何在所有文件上递归运行dos2unix: find -exec dos2unix {} \; 我需要做哪些更改才能使其跳过.svn/目录下的文件?在bash中 for fic in **/*; dos2unix $fic 在zsh中甚至更好 for fic in **/*(.); dos2unix $fic 仅提供一个附加提示:如果筛选程序接受多个参数,则通过xargs管道传递结果而不是使用find的-exec选项将提高在处理大型目录结构时的性能,因为这将减少fork()的数量,

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

find -exec dos2unix {} \;
我需要做哪些更改才能使其跳过.svn/目录下的文件?

在bash中

for fic in **/*; dos2unix $fic
在zsh中甚至更好

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

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

查找| xargs dos2unix

有一个警告:如果任何文件名包含空格,通过xargs的管道传输将非常失败

find . -path ./.svn -prune -o -print0   | xargs -0 -i echo dos2unix "{}" "{}"
如果你有bash4.0

shopt -s globstar
shopt -s dotglob
for file in /path/**
do
  case "$file" in
    */.svn* )continue;;
  esac
  echo dos2unix $file $file
done

实际测试溶液:

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

这是一个通用脚本,您可以根据需要更改最后一行。 我从我的剧本中汲取了技巧:


如何跳过
.svn/
目录?如果禁用dotglob,它将跳过隐藏文件。但是其他隐藏的文件也会被跳过,我想这不是OP想要的。噢,对不起!对于{,.}(N)中的根;执行[$root=.svn]&&continue;对于fic,单位为$root/***(.);不要做任何事;完成;工作,但查找版本现在更好…+1。谢谢对我有用。我不必担心svn文件<代码>用于*.pl中的plfile;dos2unix$plfile;完成;对于**/*.pl中的plfile;dos2unix$plfile;完成将-path./.svn更改为-path'*/.svn'应该可以解决此问题。
-i
已被弃用,请改用
-i{}
。还有,为什么两个
“{}”
查找-print0 | xargs-0…
处理带有空格的文件名。
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