[megoldva]Mintára illeszkedő nevű fájlok másolása könyvtárnévvel kiegészítve

Sziasztok!

Van egy könyvtáram, amiben sok-sok egyedi könyvtárnév van, amikben lévő fájlok közül azokat szeretném átmásolni, ami illeszkedik egy mintára. Mivel a fájlnevek lehetnek ugyanolyanok, ezért az átmásolt fájl fájlneve és a kiterjesztése közé szeretném beékelni a könyvtár nevét.
Néhány perc alatt leprogramozható, nem jelent gondot. Itt arra lennék kíváncsi, hogy shell parancsokkal egy sorban meg lehet-e csinálni. (Elegánsabb lenne, mintha programban változókkal manipulálnék.)

Fájlok megtalálása, másolása nem gond:

find ./ -type f -name "*minta*" | xargs cp -t /idemasold/

Ezt kiegészítve/módosítva van ötletetek, hogy a közvetlen könyvtárnevet is átörökítse?

Pl.:


./010101
- ezegymintafajl.txt
- XmintaX.jpg
- ygiziy.hhh
./010102
- masikmintafajl.png
- eznemkell.ttt

--> 
/idemasold
- ezegymintafajl_010101.txt
- XmintaX_010101.jpg
- masikmintafajl_010102.png

Hozzászólások

Nagy vonalakban:

- a find a teljes path-t fogja odaadni neked
- dirname megadja a folder nevet
- awk-al az utolsó / utáni részt levágod + összerakod a file névvel

--
Gábriel Ákos

basename pedig a directory-ban levő filenevet, szóval nem kell awk. Főleg, hogy ezekhez a darabolásokhoz még dirname, basename sem kell:


f=/x/y/z.w
dirname "$f" => /x/y
basename "$f" => z.w
basename "$f" .w => z
echo "${f%/*}" => /x/y # azaz ez a basename
echo "${f##*/}" => z.w # ez meg a szimpla basename

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

kezdesnek:
$ for F in $(find forras* -name "*minta*" -type f);do BN=$(basename $F); echo cp $F ./idemasold/${BN%.*}_$(dirname $F).${BN##*.}; done
cp forras1/ezegymintafajl.txt ./idemasold/ezegymintafajl_forras1.txt
cp forras1/XmintaX.jpg ./idemasold/XmintaX_forras1.jpg
cp forras2/masikmintafajl.png ./idemasold/masikmintafajl_forras2.png

csak egy szintig jo

t

csunya, de tobb szintet is tamogat:
$ for F in $(find hup/hup2/forras* -name "*minta*" -type f);do BN=$(basename $F); echo cp $F ./idemasold/${BN%.*}_$(basename $(dirname $F)).${BN##*.}; done
cp hup/hup2/forras1/ezegymintafajl.txt ./idemasold/ezegymintafajl_forras1.txt
cp hup/hup2/forras1/XmintaX.jpg ./idemasold/XmintaX_forras1.jpg
cp hup/hup2/forras2/masikmintafajl.png ./idemasold/masikmintafajl_forras2.png

Esetleg sed-del:


for ff in $(find ./ -type f -name "*minta*"); do cp $ff  `echo $ff | sed -r 's;(([^/]+)/)*([^/]+)\/([^/]+)\.([^/]+);\ idemasold/\4_\3\.\5;'` ; done

Javítottam a korábbi kódot. Még ellenőrizni kellene azokat az eseteket, amikor nincs kiterjesztése a fájlnévnek, illetve ha szóközöket is tartalmaz.

--
eutlantis

Köszönöm szépen mindenkinek a segítséget.