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
- 691 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ettől féltem.
Nem awk-ztam fősuli óta. Annyira zavar, hogy utánanézek.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Kipróbáltam, nagyon ügyes, köszönöm. Bookmarkoltam.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Nincs szóköz, és mindenhol van kiterjesztés. Nagyon köszönöm, szuper.
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen mindenkinek a segítséget.
- A hozzászóláshoz be kell jelentkezni