Nagyon egyszerű dolgot akarok csinálni, bizonyára az orrom előtt van a megoldás, csak mégsem veszem észre.
Szóval segítség!
Van egy könyvtár, amin végig kellene tekerni, és a benne levő fájlokat megetetni egy programmal, és megmondani neki, hogy az outputot milyen fájlnéven várja.
Ez korábban így ment:
for i in /var/lib/amavis/JunkList/cur/*; do
program $i /var/lib/amavis/Junk/old/`basename $i`
done
Ezzel az volt csupán a gond, hogy ha üres az adott könyvtár, akkor a $i az ugye /var/lib/amavis/JunkList/cur/* és a program meg nem kezeli ezt le.
Jó, gondoltam akkor legegyszerűbb lesz find-dal
Valahogy így képzeltem:
find /var/lib/amavis/JunkList/cur -type f -exec program {} /var/lib/amavis/Junk/old/`basename {}` \;
Igen, csak mint kiderült, itt a basename nem csinált semmit, szóval az eredmény egy /var/lib/amavis/Junk/old//var/lib/amavis... stb path lett.
OK, akkor ez:
find /var/lib/amavis/JunkList/cur -type f -execdir echo /var/lib/amavis/Junk/old/{} \;
Ez ezt mondja:
.//var/lib/amavis/Junk/old/egy
find /var/lib/amavis/JunkList/cur -type f -execdir echo /var/lib/amavis/Junk/old/ {} \;
/var/lib/amavis/Junk/old/ ./egy
Eh...
szóval mit kellene ahhoz tennem, hogy a -exec után a {}-ből csak a fájlnév maradjon?
Bizonyára meg lehet oldani, csak nem látom, hogyan. És igen, lehet hogy egyszerűbb lett volna find helyett a for ciklus előtt megnézni, van-e fájl a könyvtárban, de most már a find viselkedése érdekel.
G
- 1398 megtekintés
Hozzászólások
A programon belul hivd meg a basename-t.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Sajnos a programot nem tudom módosítani.
- A hozzászóláshoz be kell jelentkezni
Így a `basename {}` vegrehajtodik mielőtt a find elindulna, ezért nem jó.
Akkor már inkább valahogy így:
find /var/lib/amavis/JunkList/cur -type f -exec sh -c "program {} /var/lib/amavis/Junk/old/\$(basename {})" \;
- A hozzászóláshoz be kell jelentkezni
for i in $(ls -1 /var/lib/amavis/JunkList/cur/); do
és ha üres a könyvtár akkor se lesz gond
- A hozzászóláshoz be kell jelentkezni
Sikerult kihagyni a -type f opciot. Gondolom konyvtarakat nem akar feldolgozni.
Akkor inkabb mar:
for x in $(find /var/lib/amavis/JunkList/cur -type f | sed 's@/var/lib/amavis/JunkList/cur@@g'); do
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
a /var/lib/amavis/JunkList/cur alatt csak file-ok vannak (maildir), szerintem.
persze ettől még jó a -type f :)
- A hozzászóláshoz be kell jelentkezni
Igen, maildir. A -f csak a find-nak kellett, hogy magát a könyvtárat ne adja vissza találatként.
- A hozzászóláshoz be kell jelentkezni