Tegyük fel, hogy meg akarom találni az összes .txt fájlt, és néhány karakterláncot meg akarok keresni. Tenném:

find ./ -type f -name "*.txt" -exec egrep -iH "something" "{}" \; 

Mi van, ha bonyolultabb szűrést akarok végezni, így:

egrep something file.txt | egrep somethingelse | egrep other 

Inside find -exec? (vagy hasonló)

Ne feledje, hogy olyan megoldást keresek, amelyet könnyen be tudok írni, amikor szükségem van rá. Tudom, hogy ezt meg lehetne csinálni néhány sorral egy shell parancsfájl használatával, de nem ezt keresem.

Válasz

Ha a keresésen belül kell megtennie, akkor meg kell hívnia egy shellt:

find ./ -type f -name "*.txt" -exec sh -c "grep -EiH something "$1" | grep -E somethingelse | grep -E other" sh {} \; 

Más alternatívák közé tartozik a xargs használata:

find ./ -type f -name "*.txt" | xargs -I{} grep -EiH something {} | grep -EiH somethingelse | grep -EiH other 

Vagy , sokkal biztonságosabb az önkényes fájlneveknél (feltételezve, hogy a find támogatja a -print0 -et):

find ./ -type f -name "*.txt" -print0 | xargs -0 grep -EiH something {} | grep -Ei somethingelse | grep -Ei other 

Vagy használhat helyette egy shell hurkot:

find ./ -type f -name "*.txt" -print0 | while IFS= read -d "" file; do grep -Ei something "$file" | grep -Ei somethingelse | grep -Ei other done 

megjegyzések

  • Az elsőt pontosan arra kerestem. Rendkívül egyszerű és elég kicsi ahhoz, hogy az igényeimnek megfelelően gépeljek. Köszönet.
  • … és xargs xargs -I {} sh -c '...' sh {} néven is használhatók, ha valaki szeretné (ez teszi párhuzamos feladatok futtathatók -P -vel, ha valaki szeretné).

Válasz

Szerkesztés: Ez a válasz nem előnyben részesített , de itt maradt a potenciálisan veszélyes csapdák összehasonlításához és bemutatásához a bash szkriptekben.


A bash (vagy egy másik shell) -exec parancsként felveheti:

 find -type -f -name "*.txt" -exec bash -c "egrep -iH something "{}" | egrep somethingelse | egrep other" \;  

Ennek az egyik hátránya, hogy így tovább beágyazott idézési kérdések lehetősége, mivel a parancsai összetettebbé válnak. Ha ezt el akarja kerülni, for -loopra bonthatja:

 for i in $(find -type -f -name "*.txt"); do if egrep -iH something "$i" | egrep somethingelse | egrep other; then echo "Found something: $i" fi done  

Megjegyzések

  • Az elsőt pontosan arra kerestem. Rendkívül egyszerű és elég kicsi ahhoz, hogy az igényeimnek megfelelően gépeljek. Köszönöm.
  • Ez a for hurok nagyon rossz ötlet. bash # 1 .
  • Ez a "{}" az első parancsban akár kódinjekcióhoz is vezethet. Képzelje el, hogy fájlokat kapott tőlem, és ott ' s egy fájl, amely szó szerint " & rm -rf ~ & : ".txt nevet viseli. Szerencsére a -type -f érvénytelen, csak elmentette az otthoni könyvtárat. Javítsa ki az elírási hibát és próbálja újra. 🙂 Terdon jól tette: find … -exec sh -c '… "$1" …' foo {} \;.
  • Köszönöm az információt! Igen, a -type -f elírási hiba, amelyet folyamatosan követek el, amikor a find -t használom, és nem tettem ' nem veszem észre a válaszomban. Hoppá. terdon ' válasza jobb, de én ' ezt összehasonlító célokra hagyom.
  • @terdon: tx a mywiki.wooledge.org oldal hivatkozására. ' jó, hogy egy csomó háziorvos szépen összefoglalható egy helyen.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük