LINUX.ORG.RU

[bash] Find во вложенной директории и копирование

 


0

1

У меня есть папка вида:

.
XZ
XZ2
XZ3 
xz.apk
xz2.apk
xz3.apk

В каждой папке XZ есть папка dist, в которой лежит файл xz.apk Нужно с помощью find скопировать этот xz.apk в другое место. Пробовал сделать с помощью:

find ./ -maxdepth 1 -type d -exec cp {}/dist/* $HOMEDIR/unsinged/ \;

К сожалению не вышло.

Может подскажет, кто как правильно это сделать? Кроме dit в папках есть и другие файлы.

★★★

Последнее исправление: fjfalcon (всего исправлений: 1)

find ./ -iname xz.apk | while read filename; cp «$filename» /other/dir; done

babusha
()

А что, собственно, не вышло?

Может, вы просто звездочку не экранировали и bash ее интерпретировал (и {}, по-моему, тоже надо)?

И зачем там вообще *? Если можно просто написать {}/dist/xz.apk.

Кстати, если все файлы называются «xz.apk и вы их скопируете в одну папку, то они перезапишут друг друга.

Я бы так сделал:

find . -maxdepth 1 -type d -exec cp \{\}/dist/xz.apk $HOMEDIR/unsigned/\{\}.xz.apk \;

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

файлы не называются xz.apk файлы называются по названию папки. То есть если папка yz, то файл называется yz.apk

find ./ -iname xz.apk | while read filename; cp «$filename» /other/dir; done

к сожалению так он также найдет файлы, что лежат в корне, а не в директории.

fjfalcon ★★★
() автор топика
Ответ на: комментарий от fjfalcon

>файлы не называются xz.apk файлы называются по названию папки. То есть если папка yz, то файл называется yz.apk

Дык, тогда:

find . -maxdepth 1 -type d -exec cp '{}/dist/{}.apk' $HOMEDIR/unsigned \;

proud_anon ★★★★★
()
Ответ на: комментарий от fjfalcon

>cp: не удалось выполнить stat для «./frame/dist/*»: Нет такого файла или каталога

А существует ли папка ./frame/dist и есть ли в ней файлы?

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

cp: не удалось выполнить stat для «./Calendar/dist/./Calendar.apk»: Нет такого файла или каталога

А существует ли папка ./frame/dist и есть ли в ней файлы?

Существует, более того, если просто написать cp ./frame/dist/* $HOMEDIR/unsinged то все скопируется как надо.

fjfalcon ★★★
() автор топика
(cd "${SRCDIR}" && find . -name '*.apk') | while read f ;  do
	mkdir -p "`dirname "${DSTDIR}/$f"`"
	cp "${SRCDIR}/$f" "${DSTDIR}/$f"
done

// работоспособность не проверял

geekless ★★
()
$ find .
.
./xz0
./xz0/dist
./xz0/dist/xz0.apk
./xz0/tmp.fpwcrJBK9L
./xz1
./xz1/tmp.U8SGyc1pij
./xz1/dist
./xz1/dist/xz1.apk
./xz1/alala
./xz1/tmp.un9Pb07W6w
./xz1/ololo
./xz2
./xz2/tmp.OkgSWftUOZ
./xz2/tmp.uv1nfTfShJ
./xz2/tmp.dWkQUEEHuX
./xz2/dist
./xz2/dist/xz2.apk
./xz2/tmp.nyiGCk5nJ1
./xz2/tmp.aEDMG7y95k
$ find /tmp/placetogo/
/tmp/placetogo/
$ find . -type f -name '*.apk' -exec cp {} /tmp/placetogo \;
$ find /tmp/placetogo/
/tmp/placetogo/
/tmp/placetogo/xz0.apk
/tmp/placetogo/xz1.apk
/tmp/placetogo/xz2.apk
philosoft
()
Ответ на: комментарий от philosoft

Это здорово. Только есть одно но. В папке ./ есть файлы xz0.apk, xz1.apk xz2.apk xzn.apk которые надо было бы исключить...

fjfalcon ★★★
() автор топика
Ответ на: комментарий от geekless

Я уже на основе вашего кода сделал. Может по-можете оптимизировать?

Вот решение:

find ./ -maxdepth 1 -type d | while read f; do
z=`echo $f | sed s%./%%`;
echo "cp $HOMEDIR/apk/$z/dist/$z.apk $HOMEDIR/unsigned" | sh ;
done

fjfalcon ★★★
() автор топика
Ответ на: комментарий от fjfalcon

> echo «cp $HOMEDIR/apk/$z/dist/$z.apk $HOMEDIR/unsigned» | sh ;

Эм... Это зачем такое извращение?

geekless ★★
()
Ответ на: комментарий от fjfalcon

а зачем там эхо на шел перекидывается? Просто cp $HOMEDIR/apk/$z/dist/$z.apk $HOMEDIR/unsigned"

philosoft
()
Ответ на: комментарий от fjfalcon

find . -maxdepth 1 -type d -exec cp {}/dist/{}.apk /path/to/save \; Отработает, ругнувжись один раз на файлек ./dist/..apk.

philosoft
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.