Как я могу grep для файлов в структуре каталогов, которые имеют этот текст

addDesignControlChangeNotification

но не хватает этого текста

removeDesignControlChangeNotification

Спасибо!

Примечание: я имею в виду каталог, в котором запускается скрипт, и все подкаталоги.

3 ответа3

2

это должно работать:

FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
    grep $SECOND "$FILE" &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "File $FILE has $FIRST but not $SECOND"
    fi
done
1

Вот тот, который свободно основан на ответе Рича Хомолки, но работает на деревьях каталогов:

find . -type f  -exec grep -l addDesignControlChangeNotification {} \; | 
 while IFS= read -r file; do 
   grep -q removeDesignControlChangeNotification "$file" > /dev/null ; 
   [ $? -ne 0 ] && echo $file; 
 done

Любые возвращенные файлы будут содержать addDesignControlChangeNotification но не removeDesignControlChangeNotification .

ОБЪЯСНЕНИЕ:

  • find . -type f -exec grep -l foo {} \; : Это напечатает все файлы в любом подкаталоге текущего каталога, которые содержат строку foo . Флаг -l заставляет grep печатать только имена соответствующих файлов.

  • while read file : это перебирает каждый файл, найденный выше, сохраняя его имя в переменной $file .

  • grep -q bar "$file" > /dev/null : эта команда ищет строку bar в каждом из файлов, содержащих foo .

  • [ $? -ne 0 ] && echo $file; : Если возвращаемое значение ($?) команды grep было 0 (т. е. если строки не было в файле), выведите имя файла.

0

Один лайнер:

comm -2 -3 <(grep -rl addDesignControlChangeNotification     . | sort ) \
           <(grep -rl removeDesignControlChangeNotification  . | sort )

grep -r является рекурсивным grep, <() - это подстановка процесса, и comm показывает вам строки, которые имеют (не имеют) общие (отсортированные) файлы. В этом случае мы хотим только вывод столбца 1: строки в первом файле (где "file" - это действительно вывод grep), а не во втором.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .