Итак, вы можете использовать *
как подстановочный знак для всех файлов при использовании cp
в контексте каталога. Есть ли способ скопировать все файлы, кроме x
file?
решение1
Rsync прекрасно с этим справляется.
Пример копирования всего:rsync -aP /folder1/* /folder/2
Пример копирования всего с исключением:rsync -aP --exclude=x /folder1/* /folder2/
Выключатель -aP
:
a
: Аналогичноcp -a
, рекурсивный и т. д.P
: Показывает ход выполнения, удобная функция rsync.
решение2
В bash
вы можете использовать extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
где !(b*)
исключить все b*
файлы.
Позже вы сможете отключить эту функцию extglob
с помощью
$ shopt -u extglob
решение3
Это не особенность cp
, это особенность вашей оболочки (она расширяет , *
чтобы обозначить все файлы без точек), поэтому ответ зависит от того, какую оболочку вы используете. Например, zsh
поддерживает такой синтаксис:
$ cp ^x /path/to/destination
Где ^x
означает «все файлы, кроме x
»
Вы также можете комбинировать шаблоны выделения и снятия выделения, например, чтобы скопировать все wav-файлы, кроме тех, которые содержат xyz, вы можете использовать:
cp *.wav~*xyz*
решение4
Это также можно сделать в обычной старой (переносимой/совместимой) оболочке Bourne различными способами с помощью стандартных инструментов, но гораздо менее элегантными способами, чем использование расширенной подстановки команд оболочки или команд со встроенными опциями исключения.
Если файлов не слишком много (и их имена не содержат пробелы и/или переносы строк), то это может быть выходом:
cp `ls | egrep -v '^excludename$'` destdir/.
Конечно, bash
и инструменты GNU великолепны и мощны, но они все еще не всегда доступны. Если вы собираетесь поместить это в переносимый скрипт, я бы рекомендовал, find
как в комментарии Rush.