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
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 afind
-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.
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é).