在多个文件中搜索特定字符串并以递归方式复制所有文件

时间:2014-04-25 04:52:49

标签: bash scripting

我在多个目录和子目录中有35K +奇数文件。有1000个奇数文件(.c .h和其他文件名),带有唯一的字符串" FOO"在文件内容中。我试图将这些文件单独复制(保留目录结构)到另一个目录' MEOW'。有人可以查看我的bash执行并纠正我的错误

for Eachfile in `find . -iname "*FOO*" ` 
do
cp $Eachfile MEOW
done

收到以下错误

./baash.sh: line 2: syntax error near unexpected token `$'do\r''

'/baash.sh: line 2: `do

3 个答案:

答案 0 :(得分:1)

使用字符串" FOO"查找当前目录下的所有文件。在其中并将它们复制到目录MEOW,使用:

grep --null -lr FOO . | xargs -0 cp -t MEOW

find不同,grep查看文件的内容。 -l的{​​{1}}选项告诉它仅列出文件名。 grep选项告诉它在子目录中递归查找。由于文件名中可以​​包含空格和其他奇数字符,因此我们将-r选项提供给--null,以便在其生成的列表中,文件名由空字符安全地分隔。 grep从空分隔文件名列表中读取,并将它们作为参数提供给命令xargs -0,后者将它们复制到目标目录cp -t MEOW

答案 1 :(得分:1)

如果您只想在.c和.h文件中搜索字符串FOO,那么

find ./  -name "*\.c" -o -name "*\.h" -exec grep -l FOO {} \; | xargs  cp -t MEOW/

对我来说,即使没有--null xrags选项,它也可以工作,如果不适合你......那么请在xargs部分附加-0,如下所示:

xargs  -0 cp -t MEOW/

答案 2 :(得分:0)

for file in $(find -name '*.c' -o -name '*.h' -exec grep -l 'FOO' {} \;); do
    dname=$(dirname "$file")
    dest="MEOW/$dname"
    mkdir -p $dest
    cp "$file" "$dest"
done