Comments 43
Хм, а если
где:
folder— исходная директория
destination — конечная
[regexp] — собственно, регулярка
Флаг -v у grep делает следующее, если кто-нибудь запамятовал (выдержка из man):
ls folder | grep -v [regexp] | xargs cp -t destination
где:
folder— исходная директория
destination — конечная
[regexp] — собственно, регулярка
Флаг -v у grep делает следующее, если кто-нибудь запамятовал (выдержка из man):
-v, --invert-match
Selected lines are those not matching any of the specified patterns.
+4
Вы пробовали запускать? Чёто у меня оно не хочет работать:
ls /web/test/www | grep -v .*\.svn.* | xargs cp -t /web/test/tmp
cp: cannot stat `app': No such file or directory
cp: cannot stat `libraries': No such file or directory
cp: cannot stat `public': No such file or directory
0
Для текущей директории запустил:
Успешно переместило все файлы, кроме file1 в подпапку destination.
Ваше решение слишком громоздко, а «сначала копирует всё, а потом удаляет лишнее» это лишние телодвижения.
ls $1 | grep -v file1 | xargs cp $1 destination/$1
Успешно переместило все файлы, кроме file1 в подпапку destination.
Ваше решение слишком громоздко, а «сначала копирует всё, а потом удаляет лишнее» это лишние телодвижения.
+5
Моё решение обрабатывает не толь файлы, но и все папки, включая подпапки.
0
Вообще моей изначальной целью было создание копии проекта, избавляясь от директорий .svn и не обращаясь при этом к репозиторию. По этой причине была необходимость обрабатывать и субдиректории.
0
А в кавычки кто брать regexp будет? И этот человек пишет статью, состоящую целиком и полностью из одного скрипта. Вы бы хоть не позорились ужасным синтаксисом и не соблюдением элементарных правил!
+2
вместо ls folder надо просто написать find folder, это и будет решением задачи. find выводить файлы, рекурсивно просматривая каталоги.
+1
find folder | grep -v [regexp] | xargs cp -t destination
0
Да, вы правы. find как раз подходит для решения задачи ТС.
0
Проблема еще не решена. cp ругается на каталоги, но флаг -r использовать нельзя, потому что он тогда скопирует ненужные файлы, а пропускать каталоги нельзя, потому что пользователь хочет скопировать пустые каталоги тоже.
0
Еще есть другая проблема. Если писать не относительный путь в find, то в целевом каталоге будут создаваться каталоги, соответствующие полному пути исходных файлов.
0
Решение для копирования файлов, начиная от текущего каталога
DEST=~/work/test; REGEXP=js; for I in $(find ./ | grep -v "$REGEXP"); do if [ -d $I ]; then mkdir $DEST/$I; else cp $I $DEST/$I; fi; done 2>/dev/null
DEST=~/work/test; REGEXP=js; for I in $(find ./ | grep -v "$REGEXP"); do if [ -d $I ]; then mkdir $DEST/$I; else cp $I $DEST/$I; fi; done 2>/dev/null
0
cp -r path1/[^regexp] path2
не пойдёт? 0
Но ведь вы тоже решили задачу, отличную от заявленной. А если у меня в папке есть пара гигабайтных файлов, которые я копировать не хочу, и для которых в destination места не хватит?
0
А «rsync --exclude=REGEX ...» чем не устраивает?
+11
Вот так работает:
Спасибо!
rsync -r --exclude=PATTERN from/ to/
Спасибо!
+5
тем что его эксклуды — не регулярки
0
ну или аналогично rsync
tar cf — --exclude=PATTERN * | tar xf — -C newdir
думаю на www.commandlinefu.com можно еще десяток способов найти
tar cf — --exclude=PATTERN * | tar xf — -C newdir
думаю на www.commandlinefu.com можно еще десяток способов найти
0
ну и еще общий вариант — сделать список фалов, проредить его грепом и скормить как источник того что нужно копировать любой из программ
+1
#!/bin/bash
if [ $# -lt 3 ] ; then
echo "cpexclude usage: pathFrom pathTo excludeRegex"
exit 0
fi
pathFrom="$1"
pathTo="$2"
excludeRegex="$3"
# Copy everything
find "$pathFrom" -type f -not -regex "$excludeRegex" | while read A ; do {
[[ -d "$pathTo/${A%/*}" ]] || mkdir -p "$pathTo/${A%/*}"
cp -a "$A" "$pathTo/${A%/*}"
}
done
+1
UFO just landed and posted this here
Вообще есть штатное решение
Это плохой пример чисто для наглядности, плохой потому что надо сначала копировать структуру директорий а потом фаилы по регекспу. Но идея думаю понятна.
find . ! -iregex '.*gz' -exec cp -a '{}' \;
Это плохой пример чисто для наглядности, плохой потому что надо сначала копировать структуру директорий а потом фаилы по регекспу. Но идея думаю понятна.
0
А еще я тут недавно спрашивал в QA есть ли ресурс для bad practice по администрированию.
Вот собственно с этого топика пожно начать наполнять подобный блог на хабре.
Автору как новичку простительно ошибаться — видно что мозг работал просто рано остановился, но остальные должны увидеть предупреждение «НЕ ДЕЛАЙ ТАК» прежде чем начнут использовать этот код.
Вот собственно с этого топика пожно начать наполнять подобный блог на хабре.
Автору как новичку простительно ошибаться — видно что мозг работал просто рано остановился, но остальные должны увидеть предупреждение «НЕ ДЕЛАЙ ТАК» прежде чем начнут использовать этот код.
0
Sign up to leave a comment.
Как в linux консоли скопировать файлы и папки исключая некоторые из них по регулярному выражению