如何基于递归grep隔离文件

时间:2013-07-12 14:26:32

标签: bash grep

我有一个目录,每个子目录都包含一些文本文件。

 main-dir
  |
  sub-dir1
         | file1 "foo"
  |
  sub-dir2
         | file2 "bar"
  |
  sub-dir3
         | file3 "foo"

这些文件file1,file2包含相同的文本。我想根据文件内容隔离这些子目录。我想将sub-dir1和sub-dir3分组,因为这些子目录中的文件具有相同的内容。在此示例中,将sub-dir1和sub-dir3移动到另一个目录。

在递归模式下使用grep会列出与文件内容匹配的所有子目录。我怎样才能利用输出。

2 个答案:

答案 0 :(得分:1)

您的解决方案可以简化为:

for dir in *; do
  if grep "foo" "$dir/file1" >/dev/null; then
    cp -rf "$dir" "$HOME_PATH/newdir/"
  fi
done

但仅在所有目录实际包含文件file1时才有效。

这样的事情:

grep -rl "foo" * | sed -r 's|(.*)/.*|\1|' | sort -u | while read dir; do
  cp -rf "$dir" "$HOME_PATH/newdir/"
done

或者像这样:

grep -rl "foo" * | while read f; do
  dirname "$f"
done | sort -u | while read dir; do
  cp -rf "$dir" "$HOME_PATH/newdir/"
done

或者像这样:

find . -type f -exec grep -l "foo" {} \; | xargs -I {} dirname {} | sort -u |
  while read dir; do
    cp -rf "$dir" "$HOME_PATH/newdir/"
  done

可能会更好。

答案 1 :(得分:0)

我设法编写了这个解决我问题的脚本。

PWD=`$pwd`
FILES=$PWD/*

for f in $FILES
do
    str=$(cat $f/file1)
    if [ "$str" == "foo" ];
    then
         cp -rf $f $HOME_PATH/newdir/
    fi

done