Таким образом, вы можете использовать в *качестве подстановочного знака для всех файлов при использовании cpв контексте каталога. Есть ли способ скопировать все файлы, кроме xфайла?
Таким образом, вы можете использовать в *качестве подстановочного знака для всех файлов при использовании cpв контексте каталога. Есть ли способ скопировать все файлы, кроме xфайла?
Ответы:
В bashвы можете использовать extglob:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
где !(b*)исключить все b*файлы.
Вы можете позже отключить extglobс помощью
$ shopt -u extglob
findэто единственный путь tcsh:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync прекрасно с этим справляется.
Пример скопировать все: rsync -aP /folder1/* /folder/2
Пример копирования всех с исключением: rsync -aP --exclude=x /folder1/* /folder2/
-aPПереключатель:
a: аналогично cp -a, рекурсивный и т. д. P: показывает прогресс, хорошая функция rsync.
-rPвместо, -aPесли хотите рекурсировать. -aдля архивирования. Не уверен, изменилось ли это или просто изменилось в MacOS.
rsyncдействительно есть возможность сделать его рекурсивным. Пример: rsync --recursive -P --exclude=x /folder1/* /folder2/. (Проверено только в Ubuntu)
Это не особенность cp, это особенность вашей оболочки (она расширяет *для обозначения всех файлов без точек), поэтому ответ зависит от того, какую оболочку вы используете. Например, zshподдерживает этот синтаксис:
$ cp ^x /path/to/destination
Где ^xозначает "все файлы, кроме x"
Вы также можете комбинировать шаблоны выбора и отмены выбора, например, чтобы скопировать все файлы wav, кроме тех, которые содержат xyz, вы можете использовать:
cp *.wav~*xyz*
bash?
Может также быть выполнено в простой старой (переносной / совместимой) оболочке Bourne различными способами со стандартными инструментами гораздо менее изящными способами, чем использование расширенного сглаживания оболочки или команд со встроенными опциями исключения.
Если файлов не слишком много (и не с именами, включая пробелы и / или разрывы строк), это может быть способом:
cp `ls | egrep -v '^excludename$'` destdir/.
Конечно, bashи инструменты GNU великолепны и мощны, но они все еще не всегда доступны. Если вы собираетесь поместить его в переносимый скрипт, я бы порекомендовал findкак в комментарии Rush.
Если вы хотите скопировать все в папке (включая подпапки) в определенный подкаталог:
cp -R $(ls | grep -v '^subdir$') subdir/
Работает с sh, bash, zsh (как минимум).
cp -R * subdir/
cp(не от bash/ sh), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’". Копия завершается правильно, хотя. К сожалению, ваш вариант ломается с любым именем файла, содержащим пробел или пунктуацию, чувствительную к оболочке. См. Unix.stackexchange.com/q/128985/135943
extglob Я думаю, это лучший способ.
Другой способ использования
cp $(ls --ignore=x) subdir/
$и т. Д.) Никогда не анализируйте выходные данные ls. unix.stackexchange.com/q/128985/135943