我在多个目录和子目录中有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
答案 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