Как скопировать некоторые, но не все файлы?

Как скопировать некоторые, но не все файлы?

Итак, вы можете использовать *как подстановочный знак для всех файлов при использовании cpв контексте каталога. Есть ли способ скопировать все файлы, кроме xfile?

решение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.

Связанный контент