Как отделить файлы на основе рекурсивного grep

У меня есть каталог, подкаталоги, в каждом из которых есть текстовые файлы.

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

Эти файлы file1, file2 содержат одинаковый текст. Я хочу разделить эти подкаталоги на основе содержимого файлов. Я хотел бы сгруппировать sub-dir1 и sub-dir3, поскольку файлы в этих sub-dirs имеют одинаковый контент. В этом примере переместите sub-dir1 и sub-dir3 в другой каталог.

Использование grep в рекурсивном режиме перечисляет все подкаталоги, соответствующие содержимому файла. Как я могу использовать вывод.

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


Ваше решение может быть упрощено:

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

может быть лучше.

licensed under cc by-sa 3.0 with attribution.