Bu metin içeren bir dizin yapısındaki dosyaları nasıl grep edebilirim
addDesignControlChangeNotification
ama bu metni eksik
removeDesignControlChangeNotification
Teşekkürler!
Not: Yani betiğin başlayacağı dizin ve tüm alt dizinler.
Bu metin içeren bir dizin yapısındaki dosyaları nasıl grep edebilirim
addDesignControlChangeNotification
ama bu metni eksik
removeDesignControlChangeNotification
Teşekkürler!
Not: Yani betiğin başlayacağı dizin ve tüm alt dizinler.
Yanıtlar:
İşte gevşek bir şekilde Rich Homolka'nınkilere dayanan. Cevap , ancak dizin ağaçlarında çalışır:
find . -type f -exec grep -l addDesignControlChangeNotification {} \; |
while IFS= read -r file; do
grep -q removeDesignControlChangeNotification "$file" > /dev/null ;
[ $? -ne 0 ] && echo $file;
done
Dönen dosyalar içerecektir addDesignControlChangeNotification
Ama değil removeDesignControlChangeNotification
.
AÇIKLAMA:
find . -type f -exec grep -l foo {} \;
: Bu, dizgeyi içeren mevcut dizinin herhangi bir alt dizinindeki tüm dosyaları basacaktır. foo
. -l
bayrak grep'in yalnızca eşleşen dosyaların adlarını yazdırmasına neden olur.
while read file
: Bu, yukarıda bulunan her bir dosyayı tekrar eder ve ismini değişkene kaydeder. $file
.
grep -q bar "$file" > /dev/null
: bu komut dizeyi arar bar
İçerdiği dosyaların her birinde foo
.
[ $? -ne 0 ] && echo $file;
: Eğer dönüş değeri ( $?
) grep
komut 0'dı (yani, dizede dosyada değilse), dosyanın adını yazdırın.
find . -name '*.m' -type f -exec grep -l addDesignControlChangeNotification {}...
kendimden söz ettiğimden beri kendime eklediğim;) Teşekkürler!
bu çalışmalı:
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
-r
ilk grep
Dizinleri tekrarlamak istiyorsanız komut. Veya cevabımı kullanabilirsiniz;).
Bir astar:
comm -2 -3 <(grep -rl addDesignControlChangeNotification . | sort ) \
<(grep -rl removeDesignControlChangeNotification . | sort )
grep -r
özyinelemeli bir grep, <()
olduğu işlem değiştirme , ve comm
size bir çift (sıralanmış) dosyanın ortak / sahip olmadığı hatları gösterir. Bu durumda sadece sütun 1 çıktısını istiyoruz: ikincisinde olmayan ilk dosyadaki satırlar (burada "dosya" gerçekten grep çıktı)