[MEGOLDVA] Find parancs használata úgy, hogy az útvonalban szerepelnek speciális karakterek

Fórumok

Sziasztok. Régebben használtam a find parancsot arra, hogy speciális szöveget tartalmazó filet töröljön, úgy, hogy az útvonalon ahol keresem bizonyos mappák váltózóak.

Pl.:

/var/vmail/mx2.valami.hu/lab/Maildir/cur

/var/vmail/mx2.valami.hu/fas/Maildir/new

/var/vmail/mx2.valami.hu/naos/Maildir/cur

Vagyis itt lenne egy * a Maildir előtt, és 3db ? a Maildir után.

Régebben mintha ez nekem működött volna:

find /var/vmail/mx2.valami.hu/*/Maildir/??? -type f -mtime -2 -exec grep -l "direct.ro" {} \; -delete

Most viszont kiírja, hogy no such fil or directory. Az biztos, hogy a *-al és ?-elekkel van gondja, mert ha beillesztem a konkrét útvonalat, akkor megcsinálja.

Változott volna a find command?

 

Megoldás: Debian alatt nem a bash, hanem a dash az alapértelmezett, ezért a fenti parancsot be kell illeszteni egy bash -c "" közé.

Hozzászólások

find /ittkeress -parameterek -print0|xargs -0 rm

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Szerintem find / --iname "a patterned idézőjelben, hogy a shell ne oldja fel a csillagot meg a kérdőjeleket" ... És ja, a print0 általában jó ötlet.

Az iname-re azt írja, hogy inkább iwholename-et akarhatok, mert van benne / jel. VIszont arra 0 találatot ad ki. De ha konkrét útvonalat adok meg, akkor sem ad ki semmit.

find / -iwholename "/var/vmail/mx2.valami.hu/naos/Maildir/cur" -type f

Nekem működik ez is, ha bepasztálom, meg a *ozás is:

[root@1175a50f49c4 /]# mkdir -p /var/vmail/mx2.valami.hu/lab/Maildir
[root@1175a50f49c4 /]# mkdir -p /var/vmail/mx2.valami.hu/fas/Maildir
[root@1175a50f49c4 /]# mkdir -p /var/vmail/mx2.valami.hu/naos/Maildir
[root@1175a50f49c4 /]# touch /var/vmail/mx2.valami.hu/lab/Maildir/cur
[root@1175a50f49c4 /]# touch /var/vmail/mx2.valami.hu/fas/Maildir/new
[root@1175a50f49c4 /]# touch /var/vmail/mx2.valami.hu/naos/Maildir/cur
[root@1175a50f49c4 /]# echo "akarmiakarmi direct.ro barmi barmi" > /var/vmail/mx2.valami.hu/fas/Maildir/new

root@1175a50f49c4 /]# find / -iwholename "/var/vmail/mx2.valami.hu/naos/Maildir/cur" -type f
find: ‘/proc/tty/driver’: Permission denied
/var/vmail/mx2.valami.hu/naos/Maildir/cur

# nyilván érdemesebb volna a find /var/vmail/mx2.valami.hu ...

[root@1175a50f49c4 /]# find / -iwholename "/var/vmail/mx2.valami.hu/*/Maildir/???" -type f
find: ‘/proc/tty/driver’: Permission denied
/var/vmail/mx2.valami.hu/lab/Maildir/cur
/var/vmail/mx2.valami.hu/fas/Maildir/new
/var/vmail/mx2.valami.hu/naos/Maildir/cur

# A keresés is megy:
[root@1175a50f49c4 /]# find / -iwholename "/var/vmail/mx2.valami.hu/*/Maildir/???" -type f -print0|xargs -0 grep -l direct\.ro
find: ‘/proc/tty/driver’: Permission denied
/var/vmail/mx2.valami.hu/fas/Maildir/new

# Egyébként ezt így is lehet (nyilván, ha sok van, akkor a shell be fog sírni az arg lenre vagy valamire):
root@1175a50f49c4 /]# grep -l direct.ro /var/vmail/mx2.valami.hu/*/Maildir/??? 
/var/vmail/mx2.valami.hu/fas/Maildir/new

# És megy az eredeti is, de nyilván valójában itt is a shell keres.
[root@1175a50f49c4 /]# find /var/vmail/mx2.valami.hu/*/Maildir/??? -type f -exec grep -l "direct.ro" {} \;
/var/vmail/mx2.valami.hu/fas/Maildir/new


Ez egyébként egy alma:9 konténer (ez volt kéznél).

 

[root@1175a50f49c4 /]# find -version
find (GNU findutils) 4.8.0
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html&gt;.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)  
[root@1175a50f49c4 /]# bash --version
GNU bash, version 5.1.8(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html&gt;

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

 

A new és cur is könyvtár, amiben vannak a mail fileok, és azokban keresnék tartalmat. Tehát:

/var/vmail/mx2.valami.hu/fas/Maildir/new

/var/vmail/mx2.valami.hu/fas/Maildir/cur

Ezek mind könyvtárak, és benne vannak az emailek. És ezért a példád nekem csak a cur és new könyvtárakat adja meg, nem a benne levő fileokat.

 

A végén írtad ezt is: find /var/vmail/mx2.valami.hu/*/Maildir/??? -type f -exec grep -l "direct.ro" {} \;

Nah ez nekem abszolút nem megy. Régebben rémlik, hogy ez működött, mondjuk 1-2 éve, de nekem most hibára fut.

Szerkesztve: 2024. 10. 30., sze – 13:42

Szerintem ez működne:

find /var/vmail/mx2.valami.hu -name Maildir

 

Update: a -name parancsban működnek a speciális karakterek (*?), idézőjelbe is rakhatod

Figyu, én most kipróbáltam az eredetit is (nyilván más path-al) és működik a csillag az útvonalban is:

find /home/gejzir/work/*/node_modules -name *.js

 

...
/home/gejzir/work/xxxmgt/node_modules/big.js
/home/gejzir/work/xxxmgt/node_modules/des.js
/home/gejzir/work/xxxmgt/node_modules/ipaddr.js
/home/gejzir/work/xxxmgt/node_modules/bn.js
/home/gejzir/work/xxxmgt/node_modules/hash.js

...

 

update: még így is...

find /home/gejzir/work/*/node_modules/*/node_modules -name *.js
 

én úgy emlékeztem, hogy a ?-et, és a *-ot nem a find értelmezi, hanem a bash. így ha nem a bash az interpreter, akkor nem várható, hogy működjön. de ez csak egy tipp

4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.

Szerkesztve: 2024. 10. 30., sze – 15:20

1) ha egy parancsban nem takart * és/vagy ? és/vagy [kriksz-kraksz] szerepel, akkor ezeket az általad használt shell fogja helyettesíteni az illeszkedő nevekkel.

2) azaz ha beírod az eredeti find parancsodat és elé írsz egy echo parancsot, akkor látni fogod, hogy igazából milyen parancsot is akarnál futtatni

3) következésképpen más hiba van, hiszen azt írtad, hogy ha fizikailag beírod a neveket, akkor jó.

==> én ebből arra következtetek, hogy

- vagy sima PEBKAC

- vagy abnormális shell

- vagy abnormális shell beállítás (pl. "set -o noglob") - kérhetnék egy "set -o" kimenetet a hibás shellben?

vagy valami olyan körülményt elhallgatsz (akár akaratlanul), ami miatt van ez a hiba.

Amúgy azt a hibaüzenetet nagy eséllyel azért adja a find, mert megkapja a nyavalyás globbing karaktereket - és a *keresési hely nevében* nem fogja neked kiértékelni (míg pl. a -name vagy -iname után megtenné).

Amúgy krozoo meglátása a túl sok fájlnévvel jó meglátás lenne, csak akkor a shell adna hibát (a find indítása nélkül) és nem "no such file .." lenne hanem "arg list too long".

Megtennéd, hogy lefuttatod a parancsot és kopipészttel beraknád azt a 3 sort, ami erre vonatkozik

$ find /x*y*lofasz/alma/fa?? -stb

hibaüzenet

$

stílusban? Ugyanis mivel magát a hibaüzenetet is elgépelted, nyilván más is lehet hiba, ami neked nem tűnt fel, de esetleg itt valaki észreveszi.