我有一个目录,每个子目录都包含一些文本文件。
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会列出与文件内容匹配的所有子目录。我怎样才能利用输出。
答案 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