Таким образом, вы можете использовать в *
качестве подстановочного знака для всех файлов при использовании cp
в контексте каталога. Есть ли способ скопировать все файлы, кроме x
файла?
54
В 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
поддерживает этот синтаксис:Где
^x
означает "все файлы, кромеx
"Вы также можете комбинировать шаблоны выбора и отмены выбора, например, чтобы скопировать все файлы wav, кроме тех, которые содержат xyz, вы можете использовать:
источник
bash
?Может также быть выполнено в простой старой (переносной / совместимой) оболочке Bourne различными способами со стандартными инструментами гораздо менее изящными способами, чем использование расширенного сглаживания оболочки или команд со встроенными опциями исключения.
Если файлов не слишком много (и не с именами, включая пробелы и / или разрывы строк), это может быть способом:
Конечно,
bash
и инструменты GNU великолепны и мощны, но они все еще не всегда доступны. Если вы собираетесь поместить его в переносимый скрипт, я бы порекомендовалfind
как в комментарии Rush.источник
Если вы хотите скопировать все в папке (включая подпапки) в определенный подкаталог:
Работает с sh, bash, zsh (как минимум).
источник
cp -R * subdir/
cp
(не отbash
/sh
), "cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". Копия завершается правильно, хотя. К сожалению, ваш вариант ломается с любым именем файла, содержащим пробел или пунктуацию, чувствительную к оболочке. См. Unix.stackexchange.com/q/128985/135943extglob
Я думаю, это лучший способ.Другой способ использования
cp $(ls --ignore=x) subdir/
источник
$
и т. Д.) Никогда не анализируйте выходные данныеls
. unix.stackexchange.com/q/128985/135943