LINUX.ORG.RU

Как скопировать дерево каталогов, забирая из файлов только jpg, jpeg?


0

0

Ламерский вопрос. Как скопировать дерево каталогов, забирая из источника только файлы jpg, jpeg, игнорируя остальные. Каталоги - создавать все.

Можно ли обойтись без слоёв из find + cp + mkdir ?

Хочу что-то типа:

rsync -av --include='*.jpg' /path/to/foo/. /path/to/bar/.

Но у меня оно тянет все файлы подряд, зато каталоги все создала ресурсивно.

Спасибо!

Перемещено JB из talks

★☆

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

find . -name '*.jpg' -exec mkdir -p ../dstdir/$(sed -e 's/\(.*\)\/[^\/]*/\1/') \;

find . -name '*.jpg' -exec cp {} ../dstdir \;

Как-то так, думаю

bk_ ★★
()

Братишь, вступай в MMM2012 zsh, у нас всё всем платится работает

 tar cf - **/*.{jpg,jpeg} | ( cd destdir; tar xfp -)

zolden ★★★★★
()
rsync -av --filter='+ */' --filter='+ *.jpg' --filter='- *' /path/to/foo/. /path/to/bar/.
sdio ★★★★★
()
Ответ на: комментарий от GotF

да, потом я тоже подумал, что не стоило отпугивать людей словами типа zsh, а надо было сказать нечто вроде
«в bash не старее 4й версии с включенным рекурсивным глоббингом (за который sdio вечно меня шпыняет)»

zolden ★★★★★
()

Проверь. Вот так будет нормально работать?

rsync -av --include='*.jpg' --include='*.jpeg' --filter='hide,! */' /path/to/foo/. /path/to/bar/.

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

С find+cp короче.

А еще можно так (если хочется все скинуть в одну директорию):

cat /Data/scripts/gather
#!/bin/sh
#
#	gather -- gathers all jpg pictures from current folder and its subfolders into $1
#

tmp=`echo "$1" | grep "^/"`
if  [ "$tmp" != "" ]; then
    where="$1"
else
    if [ "$1" != "" ]; then
        where="$PWD/$1"
    else
	where="$PWD/GATHER"
    fi
fi
[ ! -e $where ] && mkdir $where
for file in `ls`
do
    [ "$PWD/$file" = "$where" ] && continue
    if [ -d "$file" ]; then
	cd $file
	echo -e "\n\t\tCurrent dir:\t$file"
	gather $where
	cd ../
	continue
    fi
	cp $file $where/$$-$file
done

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cadaber

Чесслово, не заморачивался бы данным вопросом.

первый здравый камент в теме, talks всё-таки

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

С find+cp короче.

С rsync — универсальнее. Одной и той же командой можно вытянуть файлы и из интернета по url, и с соседнего компа по ssh.

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

добавлю ещё один камент тоже в тему: классно у нас с тобой аватарки сочетаются, типа мы оба курим, прикол да

zolden ★★★★★
()

У меня в zsh

ls **/*.html

работает как надо. По идее, такую конструкцию можно загнать и в cp.

post-factum ★★★★★
()
Ответ на: комментарий от red_eyed_peguin

оставляю тонкие оптимизации способным падаванам, вроде тебя
как закончишь с моим вариантом - переходи к скрипту Эдди, там непаханное поле

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

оставляю тонкие оптимизации способным падаванам, вроде тебя

Способный падаван также интересуется, не сломается твой вариант при превышении максимально допустимой длины командной строки?

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

конечно сломается, но зато насколько красивее и короче смотрится на фоне месива из find'ов и cp
но раз ты уже дочитал учебник до главы «Серебряная пуля и решения, работающие ну вот воообще всегда», то значит готов для этого:
zargs — **/*.{jpg,jpeg} — tar cf - | tar xfp - -C destdir

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