【问题标题】:How to segregate files based on recursive grep如何基于递归 grep 隔离文件
【发布时间】:2013-07-12 14:26:31
【问题描述】:

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

 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 会列出所有匹配文件内容的子目录。如何利用输出。

【问题讨论】:

  • “隔离”到底是什么意思?要将它们移动到其他目录吗?
  • 目前还不清楚(对我来说)你要做什么。您似乎想要移动文件,具体取决于文件是否包含grep 可以找到的某些特定模式。匹配的文件应移动到某个尚未识别的位置;不匹配的文件可能会留在原处,或者移动到另一个尚未识别的位置。您需要编辑您的问题以阐明您的要求。

标签: bash grep


【解决方案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

可能会更好。

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2021-01-29
      • 2012-02-09
      • 2017-12-30
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多